Cod sursa(job #1363110)

Utilizator starduststardust stardust Data 26 februarie 2015 18:30:12
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include <fstream>
#define maxn 4*15010 + 100

int aint[maxn];
int n, m, sum;

void Update(int nod, int left, int right, int poz, int val)
{
	if (left == right)
	{
		aint[nod] += val;
		return;
	}

	int mid = (left + right) / 2;
	if (poz <= mid)
		Update(2 * nod, left, mid, poz, val);
	else
		Update(2 * nod + 1, mid + 1, right, poz, val);

	aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void Query(int nod, int left, int right, int start, int finish)
{
	if (start <= left && right <= finish)
	{
		sum += aint[nod];
		return;
	}
	
	int mid = (left + right) / 2;
	if (start <= mid)
		Query(2 * nod, left, mid, start, finish);
	if (mid < finish)
		Query(2 * nod + 1, mid + 1, right, start, finish);
}

int main()
{
	std::ifstream in("datorii.in");
	std::ofstream out("datorii.out");
		
	in >> n >> m;
	int x, y, z;
	for (int i = 1; i <= n; i++)
	{
		in >> x;
		Update(1, 1, n, i, x);
	}
	for (int i = 1; i <= m; i++)
	{
		in >> x >> y >> z;
		if (x == 1)
		{
			sum = 0;
			Query(1, 1, n, y, z);
			out << sum << "\n";
		}
		else
		{
			Update(1, 1, n, y, -z);
		}
	}

}