Cod sursa(job #348616)

Utilizator serbanlupulupulescu serban serbanlupu Data 16 septembrie 2009 12:39:43
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
//infoarena
//pb	:	Datorii
//arbori de intervale :D

#include <iostream>
#include <fstream>

using namespace std;

short v[15000], nr_v;
int op;
int H[45500];

void update(int node, int left, int right, int poz, int val)
{
	if (left >= right) 
	{
		H[node]=val;
		return;
	}

	int middle=(left+right)>>1;
	if (poz<=middle)
		update(2*node, left, middle, poz, val);
	else
		update(2*node+1, middle+1, right, poz, val);

	H[node]=H[2*node]+H[2*node+1];
}

int query(int node, int left, int right, int i, int j)
{
	if (i<=left && right<=j)
		return H[node];

	int middle=(left+right)>>1;
	int sum=0;
	if (i<=middle) sum=query(2*node, left, middle, i, j);
	if (middle < j) sum+=query(2*node+1, middle+1, right, i, j);

	return sum;
}

void solve()
{
	fstream f("datorii.in", ios::in);
	fstream g("datorii.out", ios::out);
	f>>nr_v;
	f>>op;
	for (int i=1; i<=nr_v; ++i)
	{
		f>>v[i];
		update(1, 1, nr_v, i, v[i]);
	}

	int dec; 
	int a, b;

	for (int i=1; i<=op; ++i)
	{
		f>>dec;
		if ( dec == 0 )
		{
			f>>a>>b;
			update(1, 1, nr_v, a, v[a]-b);
		}
		else
		{
			f>>a>>b;
			cout<<query(1, 1, nr_v, a, b)<<"\n";
		}
	}
}

int main()
{
	solve();
	return 0;
}