Cod sursa(job #284275)

Utilizator silvia_the_bestSilvia Pripoae silvia_the_best Data 21 martie 2009 15:13:45
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.13 kb
#include <cstdio>
#define FIN "datorii.in"
#define FOUT "datorii.out"
#define N 15010

int arb[N * 4 + 100];
int poz, val, start, finish, sum;

void update(int nod, int left, int right)
{
	int mid;
	if (left == right)
	{
		arb[nod] += val;
		return;
	}
	
	mid = (left + right) >> 1;
	
	if (poz <= mid)
		update(nod * 2, left, mid);
	else
		update(nod * 2 + 1, mid + 1, right);
	
	arb[nod] = arb[nod * 2] + arb[nod * 2 + 1];
}

void query(int nod, int left, int right)
{
	int mid;
	
	if (start <= left && right <= finish)
	{
		sum += arb[nod];
		return;
	}
	
	mid  = (left + right) >> 1;
	
	if (start <= mid)
		query(nod * 2, left, mid);
	if (finish > mid)
		query(nod * 2 + 1, mid + 1, right);	
}

int main()
{
	int i, type, n, m;
	
	freopen(FIN, "r", stdin);
	freopen(FOUT, "w", stdout);
	scanf("%d%d", &n, &m);
	
	for (poz = 1; poz <= n; ++poz)
	{
		scanf("%d", &val);
		
		update(1, 1, n);
	}	
	
	for (i = 1; i <= m; ++i)
	{
		scanf("%d", &type);
		
		if (type == 0)
		{
			scanf("%d%d", &poz, &val);
			val *= -1;
			update(1, 1, n);
		}
		else 
		{
			scanf("%d%d", &start, &finish);
			sum = 0;
			
			query(1, 1, n);
			
			printf("%d\n", sum);
		}
	}
}