Pagini recente » Cod sursa (job #1354399) | Cod sursa (job #2206607) | Cod sursa (job #91861) | Cod sursa (job #432539) | Cod sursa (job #357678)
Cod sursa(job #357678)
#include <cstdio>
struct node{
node* l,*r;
int d,lr,rr;
};
node* root;
void remove(int i,int val){
node*tmp=root;
while(tmp){
tmp->d-=val;
if(i>((tmp->rr+tmp->lr)/2))
tmp=tmp->r;
else
tmp=tmp->l;
}
}
int get(node* tmp,int l,int r){
if(l==tmp->lr&&r==tmp->rr)
return tmp->d;
int m=((tmp->rr+tmp->lr)/2);
if(r<=m)
return get(tmp->l,l,r);
if(l>m)
return get(tmp->r,l,r);
return get(tmp->l,l,m)+get(tmp->r,m+1,r);
}
node* init(int l,int r){
node* tmp=new node;
tmp->lr=l;
tmp->rr=r;
if(l==r)
scanf("%d",&(tmp->d));
else{
tmp->l=init(l,(l+r)/2);
tmp->r=init((l+r)/2+1,r);
tmp->d=tmp->l->d+tmp->r->d;
}
return tmp;
}
int main(){
int n,m;
int a,b;
freopen("datorii.in","rt",stdin);
freopen("datorii.out","wt",stdout);
scanf("%d%d",&n,&m);
root=init(0,n-1);
while(m--){
scanf("%d%d%d",&n,&a,&b);
if(n==1)
printf("%d\n",get(root,a-1,b-1));
else
remove(a-1,b);
}
return 0;
}