Cod sursa(job #357671)

Utilizator undogSavu Victor Gabriel undog Data 20 octombrie 2009 09:12:48
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#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){
	int val=0;
	
	if(l==tmp->lr&&r==tmp->rr)
		return tmp->d;
	
	if(r<=((tmp->rr+tmp->lr)/2))
		return get(tmp->l,l,r);
	
	if(l>((tmp->rr+tmp->lr)/2))
		return get(tmp->r,l,r);
	
	return get(tmp->l,l,((tmp->rr+tmp->lr)/2))+get(tmp->r,((tmp->rr+tmp->lr)/2)+1,r);
	
}

inline node*init(){
	node* tmp=new node;
	tmp->l=tmp->r=NULL;
	tmp->d=0;
	return tmp;
}

node* init(int l,int r){
	node* tmp=init();
	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=get(tmp->l,l,(l+r)/2)+get(tmp->r,(l+r)/2+1,r);
	}
	return tmp;
}

int main(){
	int n,m;
	int i,j,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;
}