Cod sursa(job #1075635)

Utilizator iarbaCrestez Paul iarba Data 9 ianuarie 2014 12:47:24
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.86 kb
#include <cstdio>
using namespace std;
int arb[270000],i,j,n,m,k,st,sf,s,v,p;
void update(int nod, int left, int right)
{
	if(left==right){arb[nod]+=v;}
	else{
		int mid=(left+right)/2;
		if(p<=mid){update(2*nod,left,mid);}
		else{update(2*nod+1,mid+1,right);}
		arb[nod]=arb[2*nod]+arb[2*nod+1];
		}
}
void query(int nod, int left, int right)
{
	if((st<=left)&&(sf>=right)){s+=arb[nod];}
	else{
		int mid=(left+right)/2;
		if(st<=mid){query(2*nod,left,mid);}
		if(sf>mid){query(2*nod+1,mid+1,right);}
		}
}
int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(i=1;i<=n;i++){scanf("%ld",&v);p=i;update(1,1,n);}
	for(i=1;i<=m;i++){
		scanf("%d",&k);
		if(k==0){scanf("%d%d",&p,&v);v*=-1;update(1,1,n);}
		if(k==1){scanf("%d%d",&st,&sf);s=0;query(1,1,n);printf("%d\n",s);}
					 }
return 0;
}