Cod sursa(job #327105)

Utilizator radu_cppRadu Voroneanu radu_cpp Data 27 iunie 2009 10:49:14
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.03 kb
#include<stdio.h>

long a[60000];
long op,i,m,n,dat,ziua,x,y;

void update(long nod, long st, long dr)
{
  long mij;
  if (st==dr)
	  a[nod]+=dat;
  else
  {
	  mij=(st+dr)/2;
	  if (ziua<=mij)
		  update(2*nod,st,mij);
	  else
		  update(2*nod+1,mij+1,dr);
	  a[nod]=a[2*nod]+a[2*nod+1];
   }
}

long query(long nod, long st, long dr)
{
	long mij,s;
	if (x<=st && y>=dr) return a[nod];
	else
		if (st<dr)
		{
			mij=(st+dr)/2;
			s=0;
			if (x<=mij)
				s=s+query(nod*2,st,mij);
			if (y>mij)
				s=s+query(nod*2+1,mij+1,dr);
			return s;
		}
	return 0;
}

int main()
{
	freopen("datorii.in","r",stdin);
	freopen("datorii.out","w",stdout);
	scanf("%ld %ld",&n, &m);
	for (ziua=1; ziua<=n; ++ziua)
	{
		scanf("%ld",&dat);
		update(1,1,n);
	}
	for (i=1; i<=m; ++i)
	{
		scanf("%ld",&op);
		if (op==1)
		{
			scanf("%ld %ld",&x,&y);
			printf("%ld\n",query(1,1,n));
		}
		else
		{
			scanf("%ld %ld",&ziua,&dat);
			dat=-dat;
			update(1,1,n);
		}
	}
	fclose(stdin); fclose(stdout);
	return 0;
}