Cod sursa(job #1908768)

Utilizator vladvlad00Vlad Teodorescu vladvlad00 Data 7 martie 2017 10:19:30
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <fstream>

using namespace std;

ifstream fin("datorii.in");
ofstream fout("datorii.out");

void update(int nod, int x, int y, int a, int b, int val);
int query(int nod, int x, int y, int a, int b);

int n, m, aint[30000];

int main()
{
	int i, x, y, tip;

	fin >> n >> m;
	for (i = 1; i <= n; i++)
	{
		fin >> x;
		update(1, 1, n, i, i, -x);
	}
	for (i = 1; i <= m; i++)
	{
		fin >> tip >> x >> y;
		if (tip == 0)
			update(1, 1, n, x, x, y);
		else fout << query(1, 1, n, x, y) << '\n';
	}
	return 0;
}

void update(int nod, int x, int y, int a, int b, int val)
{
	int mij;

	if (a <= x && y <= b)
		aint[nod] -= val;
	else
	{
		mij = (x + y) / 2;
		if (a <= mij)
			update(2 * nod, x, mij, a, b, val);
		if (b > mij)
			update(2 * nod + 1, mij + 1, y, a, b, val);
		aint[nod] = aint[2 * nod] + aint[2 * nod + 1];
	}
}

int query(int nod, int x, int y, int a, int b)
{
	int mij, nr1 = 0, nr2 = 0;

	if (a <= x && y <= b)
		return aint[nod];
	else
	{
		mij = (x + y) / 2;
		if (a <= mij)
			nr1 = query(2 * nod, x, mij, a, b);
		if (b > mij)
			nr2 = query(2 * nod + 1, mij + 1, y, a, b);
		return nr1 + nr2;
	}
}