AcWing 1264. 动态求连续区间和
原题链接
简单
作者:
ls131
,
2021-04-03 21:42:14
,
所有人可见
,
阅读 285
#include<iostream> //1快速求前缀和 2快速修改原数组的某一个数
#include<cstdio> //单点修改 区间和查询
#include<sstream>
#include<cstring>
#include<algorithm> //全局变量 静态变量开在堆里 初值为0 其他开在栈里
//lowbit(i)的意思是将i转化成二进制数之后,只保留最低位的1及其后面的0,截断前面的内容,然后再转成10进制数。
const int N =100010;
int n,m;
int a[N],tr[N];
using namespace std;
int lowbit(int x){ //树状点维持前缀和的有效len长度
return x&-x;
}
void add(int x,int v){
for(int i=x;i<=n;i+=lowbit(i)) tr[i]+=v; //动态维护前缀和 每次给他的父节点加值
}
int query(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++) add(i,a[i]);
while(m--){
int k,x,y;
cin>>k>>x>>y;
if(k==0) printf("%d\n",query(y)-query(x-1));
else add(x,y);
}
return 0;
}