Cod sursa(job #548954)

Utilizator marius21Marius Petcu marius21 Data 7 martie 2011 23:03:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.78 kb
#include <cstdio>
#include <cstdlib>

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

int aib[0x8000]={};

#define zeros(x) (((x)^((x)-1))&(x))

void add(int pos, int val,int n)
{
	for (int i = pos; i<=n; i+=zeros(i))
		aib[i]+=val;
}

int length(int pos)
{
	int res = 0;
	for (int i = pos; i>0; i-=zeros(i))
		res+=aib[i];
	return res;
}

int query(int aa, int bb)
{
	return length(bb)-length(aa-1);
}

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