Cod sursa(job #562236)

Utilizator darkseekerBoaca Cosmin darkseeker Data 22 martie 2011 17:53:50
Problema Datorii Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.4 kb
#include <cstdio>
using namespace std;

#define NMAX 1<<14+8
#define Input "datorii.in"
#define Output "datorii.out"

int sumArb[NMAX],poz,start,final,val,sum;

inline void insert(int node,int left,int right)
{
	int center;
	if(left==right)
	{
		sumArb[node]+=val;
		return;
	}
	center=(left+right)/2;
	if(poz<=center)
		insert(2*node,left,center);
	else
		insert(2*node+1,center+1,right);
	sumArb[node]+=val;
}

inline void update(int node,int left,int right)
{
	int center;
	if(left==right)
	{
		sumArb[node]-=val;
		return;
	}
	center=(left+right)/2;
	if(poz<=center)
		update(2*node,left,center);
	else
		update(2*node+1,center+1,right);
	sumArb[node]-=val;
}

inline void query(int node,int left,int right)
{
	if(start<=left && right<=final)
		{
			sum += sumArb[node];
			return;
	}
	int center = (left + right)/2;
	if( start <= center)
		query(2*node , left , center);
	if( center < final )
		query(2*node+1 ,center+1, right);
}

int main()
{
	int i,type,v1,v2,n,m;
	freopen (Input,"r",stdin);
	freopen (Output,"w",stdout);
	scanf("%d %d",&n,&m);
	for(i=1; i <= n ; ++i)
	{
		scanf("%d ",&val);
		poz=i;
		insert(1,1,n);
	}
	for(i=1; i <= m ; ++i)
	{
		scanf("%d %d %d",&type,&v1,&v2);
		if(!type)
		{
			val=v2;
			poz=v1;
			update(1,1,n);
		}
		else
		{
			start=v1;
			final=v2;
			sum=0;
			query(1,1,n);
			printf("%d\n",sum);
		}
	}
}