Cod sursa(job #302438)

Utilizator DraStiKDragos Oprica DraStiK Data 8 aprilie 2009 21:39:29
Problema Datorii Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.04 kb
#include <stdio.h>
#define DIM 15005
int aib[4*DIM];
int n,m,sum;
void update (int nod,int st,int dr,int poz,int nr);
void query (int nod,int st,int dr,int in,int sf);
int main ()
{
	freopen ("datorii.in","r",stdin);
	freopen ("datorii.out","w",stdout);
	int i,nr,a,b;
	scanf ("%d%d",&n,&m);
	for (i=1; i<=n; ++i)
	{
		scanf ("%d",&nr);
		update (1,1,n,i,nr);
	}
	for (i=1; i<=m; ++i)
	{
		scanf ("%d%d%d",&nr,&a,&b);
		if (!nr)
			update (1,1,n,a,-b);
		else
		{
			sum=0;
			query (1,1,n,a,b);
			printf ("%d\n",sum);
		}
	}
	return 0;
}
void update (int nod,int st,int dr,int poz,int nr)
{
	if (st==dr)
	   aib[nod]+=nr;
	else
	{
		int mij=(st+dr)/2;
		if (poz<=mij)
			update (2*nod,st,mij,poz,nr);
		else
			update (2*nod+1,mij+1,dr,poz,nr);
		aib[nod]=aib[2*nod]+aib[2*nod+1];
	}
}
void query (int nod,int st,int dr,int in,int sf)
{
	if (st>=in && dr<=sf)
		sum+=aib[nod];
	else
	{
		int mij=(st+dr)/2;
		if (in<=mij)
			query (2*nod,st,mij,in,sf);
		if (sf>mij)
			query (2*nod+1,mij+1,dr,in,sf);
	}
}