Cod sursa(job #433967)

Utilizator O_NealS. Alex O_Neal Data 4 aprilie 2010 20:32:13
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include<cstdio>
#include<fstream>
using namespace std;

int n,m,ai[30001],a,b,val,poz,SUMA;

void adauga(int nod, int s, int d)
{
	if(s==d) ai[nod]+=val;
	else if(nod<15000)
	{
		int m=(s+d)>>1;
		ai[nod]+=val;
		if(poz<=m) adauga(nod<<1,s,m);
		else adauga((nod<<1)+1,m+1,d);		
	}
}

void scade(int nod,int s, int d)
{
	if(s==d) ai[nod]-=val;
	else if(nod<15000)
	{
		int m=(s+d)>>1;
		ai[nod]-=val;
		if(poz<=m) adauga(nod<<1,s,m);
		else adauga((nod<<1)+1,m+1,d);		
	}
	
}

void suma(int nod, int s, int d)
{
	if(a<=s && d<=b) SUMA+=ai[nod];
	else 
	{
		int m=(s+d)>>1;
		if(a<=m) suma((nod<<1),s,m);
		if(b>m) suma((nod<<1)+1,m+1,d);
	}
}

int main()
{
	ifstream fin("datorii.in");
	freopen("datorii.out","w",stdout);
	fin>>n>>m;
	int x;
	for(int i=1; i<=n; ++i)
	{
		fin>>x;
		val=x;
		poz=i;
		adauga(1,1,n);
	}
	for(int i=1; i<=m; ++i)
	{
		fin>>x>>a>>b;
		if(x==0)
		{
			val=b;
			poz=a;
			scade(1,1,n);
		}
		else
		{
			SUMA=0;
			suma(1,1,n);
			printf("%d\n",SUMA);
		}
	}
	return 0;
}