Cod sursa(job #235265)

Utilizator ilincaSorescu Ilinca ilinca Data 23 decembrie 2008 11:13:29
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.98 kb
#include <stdio.h>

#define nmax 15005
#define mmax 100005

int  n, m, poz, val, f, l;
long long S, arb [5*nmax];


void update (int nod, int x, int y)
{
	if (x == y)
	{
		arb [nod]+=val;
		return;
	}
	int mij=(x+y)>>1;
	if (poz <= mij)
		update (nod<<1, x, mij);
	else
		update ((nod<<1)|1, mij+1, y);
	arb [nod]=arb [nod<<1]+arb [(nod<<1)|1];
}

void query (int nod, int x, int y)
{
	if (x >= f && y <= l)
	{
		S+=arb [nod];
		return;
	}
	int mij=(x+y)>>1;
	if (f <= mij)
		query (nod<<1, x, mij);
	if (l > mij) 
		query ((nod<<1)|1, mij+1, y);
}

int main ()
{
	freopen ("datorii.in", "r", stdin);
	freopen ("datorii.out", "w", stdout);
	int tip;
	scanf ("%d%d", &n, &m);
	for (int i=1; i<=n; ++i)
	{
		scanf ("%d", &val);
		poz=i;
		update (1, 1, n);
	}
	for (int i=1; i<=n; ++i)
	{
		scanf ("%d", &tip);
		if (!tip)
		{
			scanf ("%d%d", &poz, &val);
			val*=-1;
			update (1, 1, n);		
		}
		else
		{
			scanf ("%d%d", &f, &l);
			S=0;
			query (1, 1, n);
			printf ("%lld\n", S);
		}
	}	
	return 0;
}