Cod sursa(job #196397)

Utilizator devilkindSavin Tiberiu devilkind Data 26 iunie 2008 11:23:19
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdio.h>

#define NMAX 15002

long int arb[NMAX*3];
long int v[NMAX];
long int n,m,sum;

void update(long int nod, long int st, long int dr, long int poz, long int val)
{
	if (st==dr) arb[nod]+=val;
		else
		{
			long int mid=(st+dr)/2;
			
			if (poz<=mid) update(nod*2,st,mid,poz,val);
				else update(nod*2+1,mid+1,dr,poz,val);
			arb[nod]=arb[nod*2]+arb[nod*2+1];
		}
}

void query(long int nod, long int st, long int dr, long int a, long int b)
{
	if ( (a<=st)&&(dr<=b) ) sum+=arb[nod];
		else
		{
			long int mid=(st+dr)/2;

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

void build(long int nod, long int st, long int dr)
{
	if (st==dr) arb[nod]=v[st];
		else
		{
			long int mid=(st+dr)/2;

			build(nod*2,st,mid);
			build(nod*2+1,mid+1,dr);
			arb[nod]=arb[nod*2]+arb[nod*2+1];
		}
}

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

	long int i,x,y,z;

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

	for (i=1;i<=n;i++)
		{
			scanf("%ld ",&x);
			v[i]=x;
		}

	build(1,1,n);

	for (i=1;i<=m;i++)
		{
			scanf("%ld %ld %ld\n",&x,&y,&z);
			if (x==0) update(1,1,n,y,-z);
				else 
				{
					sum=0;
					query(1,1,n,y,z);
					printf("%ld\n",sum);
				}

		}
	return 0;
}