Cod sursa(job #566730)

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

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

int a[100000];

void zero(int nod, int x, int y)
{
	a[nod]=0;
	if (x<y)
	{
		int mij = (x+y)/2;
		zero(nod*2+1, x, mij);
		zero(nod*2+2, mij+1, y);
	}
}

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);
//	zero(0,1,n);
	for (int i=0; i<n; i++)
	{
		int x;
		fscanf(fin, "%d", &x);
		update(0,1,n,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,1,n,x,y));
		else 
			update(0,1,n,x,-y);
	}
	fclose(fin);
	fclose(fout);
    return 0;
}