Cod sursa(job #357680)

Utilizator undogSavu Victor Gabriel undog Data 20 octombrie 2009 09:45:41
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.97 kb
#include <cstdio>

struct node{
	node* l,*r;
	int d;
};

node* root;
int n;

void remove(int i,int val){
	node*tmp=root;
	int l=0,r=n;
	while(tmp){
		tmp->d-=val;
		if(i>(l+r)/2){
			tmp=tmp->r;
			l=(l+r)/2+1;
		}
		else{
			tmp=tmp->l;
			r=(l+r)/2;
		}
	}
}

int get(node* tmp,int l,int r,int lr,int rr){
	if(l==lr&&r==rr)
		return tmp->d;
	
	int m=((lr+rr)/2);
	
	if(r<=m)
		return get(tmp->l,l,r,lr,m);
	
	if(l>m)
		return get(tmp->r,l,r,m+1,rr);
	
	return get(tmp->l,l,m,lr,m)+get(tmp->r,m+1,r,m+1,rr);
	
}

node* init(int l,int r){
	node* tmp=new node;
	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 m;
	int a,b,c;
	
	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",&c,&a,&b);
		if(c==1)
			printf("%d\n",get(root,a-1,b-1,0,n-1));
		else
			remove(a-1,b);
	}
	
	return 0;
}