Cod sursa(job #664382)

Utilizator informatician28Andrei Dinu informatician28 Data 20 ianuarie 2012 00:19:06
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<fstream> 
#define dim 45000

using namespace std;
ifstream in("datorii.in"); 
ofstream out("datorii.out"); 

int N, M; 
int ArbSum[dim]; 
int Val, Pos, start, finish, sum; 

void Update(int nod, int left, int right) 
{
	if( left == right) 
	{
		ArbSum[nod] = ArbSum[nod] - Val; 
		return; 
	}
	
	int mij = ( left + right)/2; 
	if( Pos <= mij)  Update(2*nod, left, mij); 
	else             Update(2*nod+1, mij+1, right); 
	
	ArbSum[nod] = ArbSum[2*nod] + ArbSum[2*nod+1]; 
}
void Query(int nod, int left, int right) 
{
	if(start <= left && right <= finish) 
	{
		sum += ArbSum[nod]; 
		return; 
	}
	
	int mij = (left + right)/2; 
	if(start <= mij)   Query(2*nod, left, mij); 
	if(mij < finish)   Query(2*nod+1, mij+1, right); 
}
int main() 
{
	int X, A, B;
	
	in >> N >> M; 
	
	for(int i = 1; i <= N; i++) 
	{
		in >> X; 
		Pos = i, Val = -X; 
		Update(1,1,N);
	}
	
	for(int i = 1; i <= M; i++) 
	{
		in >> X >> A >> B; 
		if(X == 1) 
		{
			start = A, finish = B; 
			sum = 0;
			Query(1,1,N);
			out << sum << '\n';
		}
		else 
		{
			Pos = A, Val = B; 
			Update(1,1,N); 
		}
	}
	return 0; 
}