#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define INF 0X3f3f3f3f
const ll MAXN = 2e5 + ;
const ll MOD = 1e9 + ;
ll a[MAXN];
struct node
{
int left, right; //区间端点
ll max, sum; //看题目要求
ll lazy;
void update(ll x)
{
sum += (right - left + ) * x;
lazy += x;
}
} tree[MAXN << ];
//建树,开四倍
void push_up(int x)
{
tree[x].sum = tree[x << ].sum + tree[x << | ].sum;
tree[x].max = max(tree[x << ].max, tree[x << | ].max);
}
void push_down(int x)
{
ll lazeval = tree[x].lazy;
if (lazeval)
{
tree[x << ].update(lazeval);
tree[x << | ].update(lazeval);
tree[x].lazy = ;
}
}
//若原数组从a[1]~a[n],调用build(1,1,n);
void build(int x, int l, int r)
{
tree[x].left = l;
tree[x].right = r;
tree[x].sum = tree[x].lazy = ;
if (l == r) //若到达叶节点
{
tree[x].sum = a[l]; //存储A数组的值
tree[x].max = a[l];
}
else
{
int mid = (l + r) / ;
build(x << , l, mid);
build(x << | , mid + , r);
push_up(x);
}
return;
}
//update(1,l,r,v)
void update(int x, int l, int r, ll v) //区间更新
{
int L = tree[x].left, R = tree[x].right;
if (l <= L && R <= r)
{
tree[x].update(v);
tree[x].max += v;
}
else
{
push_down(x);
int mid = (L + R) / ;
if (mid >= l)
update(x << , l, r, v);
if (r > mid)
update(x << | , l, r, v);
push_up(x);
}
}
//单点更新,更新pos点,调用add(1,pos,v)
void add(int x, int pos, ll v) //当前更新的节点的编号为id(一般是以1为第一个编号)。pos为需要更新的点的位置,v为修改的值的大小
{ int L = tree[x].left, R = tree[x].right;
if (L == pos && R == pos) //左右端点均和pos相等,说明找到了pos所在的叶子节点
{
tree[x].sum += v;
tree[x].max += v;
return; //找到了叶子节点就不需要在向下寻找了
}
int mid = (L + R) / ;
if (pos <= mid)
add(x << , pos, v);
else
add(x << | , pos, v); //寻找k所在的子区间
push_up(x); //向上更新
}
//调用query_sum(1,l,r)即可查询[l,r]区间内元素的总和
//区间查询
ll query_sum(int x, int l, int r)
{
int L = tree[x].left, R = tree[x].right;
if (l <= L && R <= r)
return tree[x].sum;
else
{
push_down(x);
ll ans = ;
int mid = (L + R) / ;
if (mid >= l)
ans += query_sum(x << , l, r);
if (r > mid)
ans += query_sum(x << | , l, r);
push_up(x);
return ans;
}
}
//调用query_max(1,l,r)即可求[l,r]区间内元素的最大值
ll query_max(int x, int l, int r)
{
int L = tree[x].left, R = tree[x].right;
if (l == L && R == r)
return tree[x].max;
else
{
push_down(x);
int mid = (L + R) / ;
if (r <= mid)
return query_max(x << , l, r);
else if (l > mid)
return query_max(x << | , l, r);
else
return max(query_max(x << , l, mid), query_max(x << | , mid+, r));
}
}
int main()
{
ll n, m;
while (scanf("%lld%lld", &n, &m) != EOF)
{
for (int i = ; i <= n; i++)
scanf("%lld", &a[i]);
build(, , n);
getchar();
while (m--)
{
int l, r;
char que;
scanf("%c %d %d", &que, &l, &r);
getchar();
if (que == 'Q')
printf("%lld\n", query_max(, l, r));
else if (que == 'U')
update(, l,l, r - a[l]),a[l]=r;
}
}
return ;
}

最新文章

  1. 高通vuforia+Unity3D 制作ar app
  2. 修改msde登录方式,设置sa密码为空
  3. CocoSocket开源下载与编写经验分享
  4. Verilog学习笔记基本语法篇(十三)...............Gate门
  5. (原创)基于FPGA的调光流水灯(Verilog,CPLD/FPGA)
  6. [汇编] 002基础知识-CPU和寄存器
  7. git123
  8. HDU 3966 Aragorn&#39;s Story (树链点权剖分,成段修改单点查询)
  9. 20151217jquery学习笔记--注册表单
  10. Oracle的function
  11. HDU 2516 取石子游戏 (博弈论)
  12. Lua 垃圾收集机制
  13. Oracle解析复杂json的方法
  14. Ionic如何实现单选二级菜单切换
  15. Django中Q查询及Q()对象
  16. 驰骋工作流引擎 -Webservice接口说明文档
  17. 【转载】Java性能优化之JVM GC(垃圾回收机制)
  18. Postman 接口测试
  19. vue.js2.0开发中的几个技巧
  20. 20155331 2016-2017-2 《Java程序设计》第七周学习总结

热门文章

  1. $CH$3801 $Rainbow$的信号 期望+位运算
  2. 关于Mac VMFusion Centos7虚拟机网络的配置
  3. 1084 外观数列 (20 分)C语言
  4. 动态规划最短路径LintcodeNO110
  5. 关于Itext 报错-java.lang.NoClassDefFoundError: org/bouncycastle/asn1/ASN1Encodable
  6. Fabric1.4:手动启动 first-network 网络(一)
  7. 快速搭建一个自己的个人博客(Github Pages~二次元主题)
  8. 什么样的项目适合docker部署,docker应用场景
  9. 揭秘webpack plugin
  10. scala基本语法