Description

Input

第一行给出两个整数N,M。分别表示序列长度和操作个数
接下来一行有N个数,即给定的序列a1,a2,....an
接下来M行,每行对应一个操作,格式见题目描述

Output

对于每个询问操作,输出一行,表示所询问的SSi的值。

Sample Input

5 3
1 2 3 4 5
Query 5
Modify 3 2
Query 5

Sample Output

35
32

HINT

1<=N,M<=100000,且在任意时刻0<=Ai<=100000

Solution

直接用线段树维护一次前缀和的数组$S$,然后修改后缀,查询前缀。注意常数。

Code

 #include<iostream>
#include<cstring>
#include<cstdio>
#define N (100009)
#define LL long long
using namespace std; struct Sgt{LL val,add;}Segt[N<<];
int n,m,x,y;
LL a[N],S[N];
char opt[]; inline int read()
{
int x=; char c=getchar();
while (c<'' || c>'') c=getchar();
while (c>='' && c<='') x=x*+c-'', c=getchar();
return x;
} void Pushdown(int now,int l,int r)
{
if (Segt[now].add)
{
int mid=(l+r)>>;
Segt[now<<].add+=Segt[now].add;
Segt[now<<|].add+=Segt[now].add;
Segt[now<<].val+=Segt[now].add*(mid-l+);
Segt[now<<|].val+=Segt[now].add*(r-mid);
Segt[now].add=;
}
} void Update(int now,int l,int r,int l1,int r1,LL k)
{
if (l>r1|| r<l1) return;
if (l1<=l && r<=r1)
{
Segt[now].add+=k;
Segt[now].val+=(r-l+)*k;
return;
}
int mid=(l+r)>>; Pushdown(now,l,r);
Update(now<<,l,mid,l1,r1,k);
Update(now<<|,mid+,r,l1,r1,k);
Segt[now].val=Segt[now<<].val+Segt[now<<|].val;
} LL Query(int now,int l,int r,int l1,int r1)
{
if (l>r1|| r<l1) return ;
if (l1<=l && r<=r1) return Segt[now].val;
int mid=(l+r)>>; Pushdown(now,l,r);
return Query(now<<,l,mid,l1,r1)+Query(now<<|,mid+,r,l1,r1);
} int main()
{
n=read(); m=read();
for (int i=; i<=n; ++i)
a[i]=read(), S[i]=S[i-]+a[i], Update(,,n,i,i,S[i]);
while (m--)
{
scanf("%s",&opt); x=read();
if (opt[]=='Q') printf("%lld\n",Query(,,n,,x));
else y=read(), Update(,,n,x,n,y-a[x]), a[x]=y;
}
}

最新文章

  1. 【Beta】用户问题反馈及处理(一直更新)
  2. Linux命令学习总结:chage
  3. python基础之编码问题
  4. Redis客户端连接池
  5. 黑马程序员——【Java高新技术】——代理
  6. VS高效开发快捷键
  7. 我心中的核心组件(可插拔的AOP)~分布式Session组件
  8. Linux下的IO模式
  9. php各种编码集详解和以及在什么情况下进行使用
  10. 30天,O2O速成攻略【8.22北京站】
  11. QQ浏览器不支持JS问题
  12. C++ 包含头文件 和 宏的使用 和 条件编译
  13. UVA 10003 Cutting Sticks 切木棍 dp
  14. C语言之基本算法35—数组上三角之积 主对角之积 副对角之积
  15. python函数式编程之装饰器(二)
  16. Beta阶段敏捷冲刺每日报告——Day0
  17. MySQL 5.7开启二进制日志注意事项
  18. C#6.0语言规范(一) 介绍
  19. day25 初始面向对象
  20. Motorola C118 PCB原理高清图

热门文章

  1. nehibernet .net注意事项
  2. Java使用递归的方法进行冒泡排序
  3. HDFS 操作命令总结
  4. Java 强制类型转换
  5. POJ2186(强连通分量分解)
  6. equals与hashcode区别
  7. 转 .md即markdown文件的基本常用编写语法(图文并茂)
  8. 自定义data-*
  9. 多个Portal for ArcGIS 间的协作实操
  10. jQuery事件和JSON点语法