Cod sursa(job #493740)

Utilizator marius21Marius Petcu marius21 Data 19 octombrie 2010 12:45:11
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1 kb
#include <cstdio>
#include <cstdlib>

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

int a[0x8000]={};

void add(int nod, int st, int en, int pos, int val)
{
	a[nod]+=val;
	if (st!=en)
	{
		int mij = (st+en)>>1;
		if (pos<=mij)
			add((nod<<1)+1,st,mij,pos,val);
		else
			add((nod<<1)+2,mij+1,en,pos,val);
	}
}

int sum;
void query(int nod, int st, int en, int aa, int bb)
{
	if ((aa<=st)&&(en<=bb))
	{
		sum+=a[nod];
	} else {
		int mij = (st+en)>>1;
		if (aa<=mij)
			query((nod<<1)+1,st,mij,aa,bb);
		if (bb>mij)
			query((nod<<1)+2,mij+1,en,aa,bb);
	}
}

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);
		add(0, 0, n-1, i, x);
	}
	for (int i=0; i<m; i++)
	{
		int c,a,b;
		fscanf(fin, "%d%d%d",&c,&a,&b);
		if (c==0)
		{
			a--;
			add(0, 0, n-1, a, -b);
		} else {
			a--; b--;
			sum = 0;
			query(0, 0, n-1, a, b);
			fprintf(fout, "%d\n",sum);
		}
	}
	fclose(fin);
	fclose(fout);
    return 0;
}