#include <iostream>
using namespace std;
const int MAX_N=10010;
int s[4*MAX_N];
void up(int p){
s[p]=s[p*2]+s[p*2+1];
}
void modify(int p,int l,int r,int x,int v){
//节点x上的权值增加v;
if(l==r){
s[p]+=v;
return ;
}
int mid=(l+r)/2;
if(x<=mid){
modify(p*2,l,mid,x,v);
}else{
modify(p*2+1,mid+1,r,x,v);
}
up(p);
}
int query(int p,int l,int r,int x,int y){
//p,l,r为当前更新到的节点,左右端点,x,y为要查询的区间
if(x<=l&&r<=y){
return s[p];
}
int mid=(l+r)/2,res=0;
if(x<=mid){
res+=query(p*2,l,mid,x,y);
}
if(y>mid){
res+=query(p*2+1,mid+1,r,x,y);
}
return res;
}
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
int d;
cin>>d;
modify(1,1,n,i,d);
}
int q;
cin>>q;
while(q--){
int d,x,y;
cin>>d>>x>>y;
if(d==0){ //x处增加y
modify(1,1,n,x,y);
}else{//询问x-y的和
cout<<query(1,1,n,x,y)<<endl;
}
}
return 0;
}
线段树(单点操作)
猜你喜欢
转载自blog.csdn.net/qq_40679299/article/details/81638657
今日推荐
周排行