Cod sursa(job #562293)

Utilizator darkseekerBoaca Cosmin darkseeker Data 22 martie 2011 20:01:10
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.42 kb
#include <cstdio>
#include <fstream>
using namespace std;

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

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

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;
}

 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]=sumArb[2*node]+sumArb[2*node+1];
}

 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;
	ifstream fin(Input);
	freopen (Input,"r",stdin);
	freopen (Output,"w",stdout);
	fin>>n>>m;
	for(i=1; i <= n ; ++i)
	{
		fin>>val;
		poz=i;
		insert(1,1,n);
	}
	for(i=1; i <= m ; ++i)
	{
		fin>>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);
		}
	}
}