Cod sursa(job #546045)

Utilizator david_raucaRauca Ioan David david_rauca Data 4 martie 2011 12:24:03
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include<fstream>
using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

int n, m, p, v, start, finish, rasp;

int arb[60001];

void Read();
void Update( int nod, int st, int dr );
void Query( int nod, int st, int dr );

int main()
{
	Read();
	
	fin.close();
	fout.close();
	
	return 0;
}

void Read()
{
	fin >> n >> m;
	
	int x;
	
	for( int i = 1; i <= n; ++i )
	{
		fin >> x;
		v = x;
		p = i;
		Update( 1, 1, n );
	}
	
	int t, a, b;
	
	for( int i = 1; i <= m; ++i )
	{
		fin >> t >> a >> b;
		if( t == 1 )
		{
			start = a;
			finish = b;
			rasp = 0;
			Query( 1, 1, n );
			fout << rasp << '\n';
		}
		else
		{
			p = a;
			v = -b;
			Update( 1, 1, n );
		}
	}
}

void Update( int nod, int st, int dr )
{
	if( st == dr )
	{
		arb[nod] += v;
		return;
	}
	
	int mij = (st+dr)/2;
	
	if( p <= mij )
	{
		Update( 2*nod, st, mij );
		arb[nod] += v;
	}
	else
	{
		Update( 2*nod+1, mij+1, dr );
		arb[nod] += v;
	}
}

void Query( int nod, int st, int dr )
{
	if( start <= st && finish >= dr )
	{
		rasp += arb[nod];
		return;
	}
	
	int mij = (st+dr)/2;
	
	if( start <= mij )
		Query( 2*nod, st, mij );
	if( finish > mij )
		Query( 2*nod+1, mij+1, dr );
}