Cod sursa(job #355994)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 12 octombrie 2009 22:40:42
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <stdio.h>
#define N 1<<14
#define M 1<<15
int n,m,v[N],poz[N],arb[M];
void cstr(int,int,int);
void update(int,int);
void read()
{
	scanf("%d%d",&n,&m);
	cstr(1,1,n);
	int i;
	for (i=1; i<=n; i++)
	{
		scanf("%d",&v[i]);
		update(i,v[i]);
	}
}
void cstr(int nod,int x,int y)
{
	if (x==y)
	{
		poz[x]=nod;
		return;
	}
	int mij=(x+y)/2;
	cstr(2*nod,x,mij);
	cstr(2*nod+1,mij+1,y);
}
void update(int x,int y)
{
	int start=poz[x],k;
	//arb[start]+=y;
	for (k=start; k>0; k/=2)
		arb[k]+=y;
}
int query(int nod,int st,int dr,int poz1,int poz2)
{
	if (st>=poz1 && dr<=poz2)
		return arb[nod];
	if (st>poz2 || dr<poz1)
		return 0;
	int mij=(st+dr)/2;
	return query(2*nod,st,mij,poz1,poz2)+query(2*nod+1,mij+1,dr,poz1,poz2);
}
int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	read();
	int i,x,y,tip;
	for (i=1; i<=m; i++)
	{
		scanf("%d%d%d",&tip,&x,&y);
		if (!tip)
			update(x,-y);
		else
			printf("%d\n",query(1,1,n,x,y));
	}
	return 0;
}