Cod sursa(job #2657211)

Utilizator IRadu1529Radu Ionescu IRadu1529 Data 10 octombrie 2020 09:03:16
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.27 kb
#include <fstream>
#include <vector>

using namespace std;

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

const int NMAX = 15001;

int n, m;

int aint[4 * NMAX], v[NMAX + 1];

void build(int nod, int l, int r) {
	if (l == r) {
		aint[nod] = v[l];
		return;
	}
	int mj = (l + r) / 2;
	build(nod * 2, l, mj);
	build(nod * 2 + 1, mj + 1, r);
	aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

void update(int nod, int l, int r, int poz, int val) {

	if (l == r) {
		aint[nod] -= val;
		return;
	}
	int mj = (l + r) / 2;
	if (poz > mj)
		update(nod * 2 + 1, mj + 1, r, poz, val);
	else
		update(nod * 2, l, mj, poz, val);
	aint[nod] = aint[nod * 2] + aint[nod * 2 + 1];
}

int query(int nod, int l, int r, int x, int y) {
	if (l >= x && r <= y) {
		return aint[nod];
	}
	int mj = (l + r) / 2;
	int s1 = 0, s2 = 0;
	if (x <= mj)
		s1 = query(nod * 2, l, mj, x, y);
	if (y > mj)
		s2 = query(nod * 2 + 1, mj + 1, r, x, y);
	return s1 + s2;

}

int main() {

	int x, y, type;

	fin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		fin >> v[i];
	}
	build(1, 1, n);
	for (int i = 1; i <= m; ++i) {
		fin >> type >> x >> y;
		if (type == 0) {
			update(1, 1, n, x, y);
		}
		else {
			fout << query(1, 1, n, x, y) << "\n";
		}

	}
}