https://www.cnblogs.com/shadowland/p/5870339.html讲解
https://blog.youkuaiyun.com/f2935552941/article/details/81240650
https://www.cnblogs.com/PJQOOO/p/4660854.html题目
#include<iostream>
#include<cstdio>
using namespace std;
int inp[500010];
long long tr[500010*4];
void built(int k,int l,int r) { //建树
if(l==r) { //目光所致都是你
tr[k]=inp[l];
return ;
}
int mid=(l+r)/2; //好吧我们一同漫游
built(k*2,l,mid);
built(k*2+1,mid+1,r);
tr[k]=tr[k*2]+tr[k*2+1];
}
void change(int k,int l,int r,int x,int y) { //改点
if(x>r||x<l) return ; //找不到
if(l==r&&l==x) { //于千万人之中遇见你所遇见的人
tr[k]+=y;
return ;
}
int mid=(l+r)/2; //好吧我们一同漫游
change(k*2,l,mid,x,y);
change(k*2+1,mid+1,r,x,y);
tr[k]=tr[k*2]+tr[k*2+1]; //更新
}
long long query(int k,int l,int r,int x,int y) { //查询
if(y<l||x>r) return 0; //找不到
if(l>=x&&r<=y) return tr[k]; //恰寻
int mid=(l+r)/2; //好吧我们一同漫游
long long re=0;
re=query(k*2,l,mid,x,y);
re+=query(k*2+1,mid+1,r,x,y);
return re;
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&inp[i]);
built(1,1,n);
for(int i=1;i<=m;i++) {
int k,l,r;
scanf("%d%d%d",&k,&l,&r);
if(k==1) change(1,1,n,l,r);
else printf("%lld\n",query(1,1,n,l,r));
}
}
如代码所示……