Cod sursa(job #3365328)

Utilizator gilbusJoita Cristian gilbus Data 19 septembrie 2026 12:42:52
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream fin("datorii.in");
ofstream fout("datorii.out");
int n, m;
vector<int>sir, ait;
void Build(int nod, int st, int dr) {
	if (st == dr) {
		ait[nod] = sir[st];
		return;
	}
	int mijloc = (st + dr) / 2;
	Build(nod * 2, st, mijloc);
	Build(nod * 2 + 1, mijloc + 1, dr);
	ait[nod] = ait[nod * 2] + ait[nod * 2 + 1];
}
void Update(int nod, int st, int dr, int poz, int val) {
	if (st == dr) {
		ait[nod] -= val;
		return;
	}
	int mijloc = (st + dr) / 2;
	if (poz <= mijloc) {
		Update(nod * 2, st, mijloc, poz, val);
	}
	else {
		Update(nod * 2 + 1, mijloc + 1, dr, poz, val);
	}
	ait[nod] = ait[nod * 2] + ait[nod * 2 + 1];
}
int query(int nod, int st, int dr, int L, int R) {
	if (L <= st && R >= dr) {
		return ait[nod];
	}
	else if (st > R || dr < L) {
		return 0;
	}
	int mijloc = (st + dr) / 2;
	return query(nod * 2, st, mijloc, L, R) + query(nod * 2 + 1, mijloc + 1, dr, L, R);
}
int main() {
	fin >> n >> m;
	sir.resize(n + 1);
	ait.resize(4 * (n + 1));
	for (int i = 1; i <= n; i++) {
		fin >> sir[i];
	}
	int optiune;
	Build(1, 1, n);
	while (m--) {
		fin >> optiune;
		if (optiune) {
			int P, Q;
			fin >> P >> Q;
			fout << query(1, 1, n, P, Q) << '\n';
		}
		else {
			int T, V;
			fin >> T >> V;
			Update(1, 1, n, T, V);
		}
	}
}