代码如下
#include<cstdio>
#include<cctype>
#include<vector>
#include<iostream>
using namespace std;
typedef pair<int,int> pii;
typedef pair<pii,int> ppi;
vector<ppi>tree;
vector<int>a;
#define l(x) tree[x].first.first
#define r(x) tree[x].first.second
#define sum(x) tree[x].second
int scan(){
register int x=0,f=1,ch;
while(!isdigit(ch=getchar()))
if(ch=='-')
f=-f;
x=ch-48;
while(isdigit(ch=getchar()))
x=x*10+ch-48;
return x*f;
}
void build(int p,int l,int r){
l(p)=l,r(p)=r;
if(l==r){
sum(p)=a[l];
return;
}
int mid=(l+r)/2;
build(p*2 , l , mid);
build(p*2+1,mid+1,r);
sum(p)=sum(p*2)+sum(p*2+1);
return;
}
void change(int p,int x,int v){
if(l(p)==r(p)){
sum(p)+=v;
return;
}
int mid=(l(p)+r(p))/2;
if(x<=mid)
change(p*2,x,v);
else
change(p*2+1,x,v);
sum(p)=sum(p*2)+sum(p*2+1);
return;
}
int ask(int p,int l,int r){
if(l<=l(p)&&r>=r(p))
return sum(p);
int mid=(l(p)+r(p))/2,val=0;
if(l<=mid)
val+=ask(p*2,l,r);
if(r>mid)
val+=ask(p*2+1,l,r);
return val;
}
int main(){
int n=scan(),m=scan();
tree.resize(n*4+1);
a.push_back(0);
for(int i=1;i<=n;++i)
a.push_back(scan());
build(1,1,n);
for(int i=0,x,y;i<n;++i)
switch(scan()){
case 1:x=scan();y=scan();change(1,x,y);break;
case 2:x=scan();y=scan();printf("%d\n",ask(1,x,y));break;
}
return 0;
}