Cod sursa(job #644656)

Utilizator Eugen01Vasilescu Eugen Eugen01 Data 7 decembrie 2011 11:23:32
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
//#include<stdio.h>
#include<fstream.h>

ifstream in("datorii.in");
ofstream out("datorii.out");

int type,sol,x,y,i,j,n,m,H[30009];

void update(int nod,int st,int dr,int poz,int x)
{
	int m=(st+dr)/2;;
	
	if (st==dr) 
	{
		H[nod]-=x;
		return;
	}
	
	if (poz<=m) update(nod<<1,st,m,poz,x);
		else update((nod<<1)+1,m+1,dr,poz,x);
	
	H[nod]=H[(nod<<1)]+H[(nod<<1)+1];
}

void querry(int nod,int st,int dr,int a,int b)
{
	int m=(st+dr)/2;;
	
	if (a<=st&&dr<=b)
	{
		sol+=H[nod];
		return;
	}

	if (a<=m) querry(nod<<1,st,m,a,b);
	if (b>m) querry((nod<<1)+1,m+1,dr,a,b);
}

int main()
{
	//freopen("datorii.in","r",stdin);
	//freopen("datorii.out","w",stdout);
	
	//scanf("%d%d",&n,&m);
	in>>n>>m;
	
	for (i=1;i<=n;i++)
	{
		//scanf("%d",&x);
		in>>x;
		update(1,1,n,i,-x);
	}
	
	for (i=1;i<=m;i++)
	{
		//scanf("%d%d%d",&type,&x,&y);
		in>>type>>x>>y;
		if (type==0) update(1,1,n,x,y);
			else 
			{
				sol=0;
				querry(1,1,n,x,y);
				//printf("%d\n",sol);
				out<<sol<<"\n";
			}
	}
}