Cod sursa(job #397752)

Utilizator sory1806Sandu Sorina-Gabriela sory1806 Data 17 februarie 2010 13:39:19
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 0.93 kb
#include<stdio.h>
#define max 15010
int arb[4*max], n, m, i, j, sol;

void update(int val, int poz, int nod, int s, int d)
{	int mj;
	if(s==d)
	{	arb[nod]=arb[nod]-val;
		return;
	}
	mj=(s+d)/2;
	if(poz<=mj)	update(val, poz, 2*nod, s, mj);
	else		update(val, poz, 2*nod+1, mj+1, d);
	arb[nod]=arb[2*nod]+arb[2*nod+1];
}

void find(int nod, int s, int d, int a, int b)
{	int mj;
	if(s>=a && d<=b)
	{	sol+=arb[nod];
		return;
	}
	mj=(s+d)/2;
	if(a<=mj)	find(2*nod, s, mj, a, b);
	if(b>mj)	find(2*nod+1, mj+1, d, a, b);
}

int main()
{	int op, a, b, x;
	freopen("datorii.in", "r", stdin);
	freopen("datorii.out", "w", stdout);
	scanf("%d%d", &n, &m);
	for(i=1; i<=n; i++)
	{	scanf("%d", &x);
		update(-x, i, 1, 1, n);
	}
	for(i=1; i<=m; i++)
	{	scanf("%d%d%d", &op, &a, &b);
		if(op==0)
			update(b, a, 1, 1, n);
		if(op==1)
		{	sol=0;
			find(1, 1, n, a, b);
			printf("%d\n", sol);
		}		
	}
	return 0;
	
}