Cod sursa(job #355210)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 10 octombrie 2009 13:26:14
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
#include <cstdio>
#define ARB 32768 //2^15
#define N 15001

int arb[ARB],frunza[N];
int x,y;

void construire(int a, int b, int poz)
{
	if (a == b)
	{
		frunza [a] = poz;
		return;
	}
	int mij = (a+b)/2;
	construire(a,mij,2*poz);
	construire(mij+1,b,2*poz+1);
}

void adaugare(int poz, int val)
{
	int k = frunza[poz];
	arb [k] -= val;
	for (k/=2;k>=1;k/=2)
		arb[k] = arb [2*k] + arb [2*k+1];
}

int interogare(int a, int b, int poz)
{
	if ((x <= a)&&(b <= y))
		return arb[poz];
	if ((b < x)||(y < a))
		return 0;
	int	mij = (a+b)/2;
	return interogare(a,mij,2*poz)+interogare(mij+1,b,2*poz+1);
}

int main()
{
	int n,m,nr,tip;
	freopen ("datorii.in","r",stdin);
	freopen ("datorii.out","w",stdout);
	scanf ("%d%d",&n,&m);
	construire(1,n,1);
	for (int i = 1; i <= n; ++i)
	{
		scanf ("%d",&nr);
		adaugare(i,-nr);
	}
	for (int i = 1; i <= m; ++i)
	{
		scanf ("%d%d%d",&tip,&x,&y);
		if (tip == 0)
			adaugare(x,y);
		else
			printf ("%d\n",interogare(1,n,1));
	}
	return 0;
}