Cod sursa(job #562676)

Utilizator avram_florinavram florin constantin avram_florin Data 23 martie 2011 17:52:25
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include<fstream>
#include<cstdio>

using namespace std;

const int MaxN = 100001;

int n,m,val,poz,cost,st,dr,Arb[MaxN];

void update(int nod,int left , int right )
{
	if( left == right )
		{
			Arb[nod] -= val;
			return ;
		}
	int midd = (left+right)>>1;
	if( poz <= midd )
		update(2*nod,left,midd);
		else
		update(2*nod,midd+1,right);
	Arb[nod] = Arb[2*nod] + Arb[2*nod+1];
}

void query(int nod,int left , int right)
{
	if( st <= left && right <= dr )
		{
			cost += Arb[nod];
			return ;
		}
	int midd = (left+right)>>1;
	if( st <= midd )
		query(2*nod,left,midd);
	if( midd < dr )
		query(2*nod+1,midd+1,right);
}

void update_initial(int nod,int left,int right)
{
	if( left == right )
		{
			Arb[nod] = val;
			return ;
		}
	int midd = (left + right) >> 1;
	if( poz <= midd )
		update_initial(2*nod,left,midd);
		else
		update_initial(2*nod+1,midd+1,right);
	Arb[nod] = Arb[2*nod] + Arb[2*nod+1];
}

int main()
{
	freopen( "datorii.in" , "r" , stdin );
	freopen( "datorii.out" , "w" , stdout );
	scanf("%d%d" , &n , &m);
	int i,x;
	for( i = 1 ; i <= n ; i++ )
		{
			scanf("%d" , &x);
			poz = i;
			val = x;
			update_initial(1,1,n);
		}
	int op,a,b;
	for( i = 1 ; i <= m ; i++ )
		{
			scanf("%d%d%d" , &op ,&a , &b);
			if( !op )
				{
					poz = a;
					val = b;
					update(1,1,n);
				}
				else
				{
					cost = 0;
					st = a;
					dr = b;
					query(1,1,n);
					printf("%d\n" , cost);
				}
		}
	return 0;
}