Cod sursa(job #472937)

Utilizator dornescuvladVlad Eugen Dornescu dornescuvlad Data 27 iulie 2010 09:28:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <iostream>
#include <fstream>
#define maxn 15005

using namespace std;

const char iname[] = "datorii.in";
const char oname[] = "datorii.out";

ifstream fin(iname);
ofstream fout(oname);

int A[maxn], Arb[3 * maxn], i, j, N, M, operation, pos, val, a, b, sol, semn;

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

void query(int nod, int left, int right)
{
	if(a <= left && right <= b)
	{
		sol = sol + Arb[nod];
		return;
	}
	else
	{	
		int middle = (left + right) >> 1;
		if(a <= middle)
			query(2 * nod, left, middle);
		if(b > middle)
			query(2 * nod + 1, middle + 1, right);
	}
}


int main()
{
	fin >> N >> M;
	for(i = 1; i <= N; i ++)
	{
		fin >> A[i];
		semn = 1;
		pos = i;
		val = A[i];
		update(1, 1, N);
	}
	for(i = 1; i <= M; i ++)
	{
		fin >> operation;
		if(!operation)
		{	
			semn = -1;
			fin >> pos >> val;
			update(1, 1, N);
		}
		else
		{	
			sol = 0;
			fin >> a >> b;
			query(1, 1, N);
			fout << sol << "\n";
		}
	}
	return 0;
}