Cod sursa(job #566717)

Utilizator marius21Petcu Marius marius21 Data 29 martie 2011 11:13:46
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include <cstdio>
#include <cstdlib>

FILE *fin=fopen("datorii.in","r");
FILE *fout=fopen("datorii.out","w");

int a[40000];

void update(int nod, int x, int y, int p, int v)
{
	a[nod]+=v;
	if (x<y)
	{
		int mij = (x+y)/2;
		if (p<=mij)
			update(nod*2+1,x,mij,p,v);
		else
			update(nod*2+2,mij+1,y,p,v);
	}
}

int query(int nod, int x, int y, int aa, int bb)
{
	if ((aa<=x) && (y<=bb))
		return a[nod];
	else
	{
		int sum = 0;
		int mij = (x+y)/2;
		if (aa<=mij)
			sum+=query(nod*2+1,x,mij,aa,bb);
		if (bb>mij)
			sum+=query(nod*2+2,mij+1,y,aa,bb);
		return sum;
	}
}

int main (int argc, char * const argv[]) {
	int n,m;
	fscanf(fin, "%d%d",&n,&m);
	for (int i=0; i<n; i++)
	{
		int x;
		fscanf(fin, "%d", &x);
		update(0,0,n-1,i,x);
	}
	for (int i=0; i<m; i++)
	{
		int c,x,y;
		fscanf(fin, "%d%d%d",&c,&x,&y);
		if (c)
			fprintf(fout,"%d\n",query(0,0,n-1,x-1,y-1));
		else 
			update(0,0,n-1,x,-y);
	}
	fclose(fin);
	fclose(fout);
    return 0;
}