Cod sursa(job #348625)

Utilizator serbanlupulupulescu serban serbanlupu Data 16 septembrie 2009 13:52:20
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
//infoarena
//pb	:	Datorii
//arbori de intervale :D

#include <iostream>
#include <fstream>
#include <ctime>

using namespace std;

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

inline 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];
}

inline 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=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;
			v[a]=v[a]-b;
			update(1, 1, nr_v, a, v[a]-b);
		}
		if ( dec == 1)
		{
			f>>a>>b;
			g<<query(1, 1, nr_v, a, b)<<"\n";
		}
	}
	f.close();
	g.close();
}

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