Cod sursa(job #123304)

Utilizator judy_kCristina Petrovici judy_k Data 15 ianuarie 2008 14:46:32
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>

#define DBG 0

using namespace std;

int n, m, nextn, nextns;
int v[100000];
int sum;


void init(int zi, int val)
{
	if(zi!=0)
	{
		v[zi] += val;
		init((zi-1)/2, val);
	}
	else
	{
		v[0] += val;
	}
}

int query(int nod, int st, int dr, int a, int b)
{
	int mij;

	if(a<=st && dr<=b)
	{
//		fprintf(stderr, "MATCHED ON %d\n", nod);
		sum += v[nod-1];
	}
	else
	{
		mij = (st+dr)/2;

		if(a <= mij)
			query(2*nod, st, mij, a, b);
		if(b > mij)
			query(2*nod+1, mij+1, dr, a, b);
	}
}

int main()
{
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);

	int i, tmp, t1, t2, t3;

	scanf("%d%d", &n, &m);

	nextn = 1;

	while(nextn < n)
	{
		nextn = nextn << 1;
	}

	tmp = nextn;

	while(tmp)
	{
		nextns += tmp;
		tmp = tmp >> 1;	
	}
	
	for(i=0; i<n; i++)
	{
		scanf("%d", &tmp);
		init(nextns-nextn+i, tmp);
	}
	
	for(i=0; i<m; i++)
	{
		scanf("%d%d%d", &t1, &t2, &t3);
		
		if(t1 == 0)
		{
			init(nextns-nextn+t2-1, -t3);
		}
		else
		{
			sum=0;
			query(1, 1, nextn, t2, t3);
			printf("%d\n", sum);
		}
	}

	if(DBG)
	{
		for(i=0; i<nextns; i++)
		{
			fprintf(stderr, "%d ", v[i]);
		}

		printf("\n");
	}

	query(1, 1, 8, 3, 8);

//	fprintf(stderr, "%d\n", sum);
	return 0;
}