Cod sursa(job #2750033)

Utilizator cristivasileVasile George-Cristian cristivasile Data 9 mai 2021 16:15:09
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.2 kb
#include <fstream>
#include <iostream>

using namespace std;

ifstream f("datorii.in");
ofstream g("datorii.out");

int n, m, x, opt, pos, p, u, sum;
int arb[500001];

//acelasi algoritm ca la arbint, doar ca fiecare nod retine suma tuturor elementelor din interval in loc de maximul din acesta

void update(int nod, int p, int u, int pos, int val) {
	int mij;
	if (p == u) {
		arb[nod] += val;
	}
	else {
		mij = (p + u) / 2;

		if (pos <= mij)	
			update(2 * nod, p, mij, pos, val);
		else update(2 * nod + 1, mij + 1, u, pos, val);

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

void query(int nod, int p, int u, int ip, int iu) {
	int mij;
	if (ip <= p && u <= iu) {
		sum += arb[nod];
	}
	else {
		mij = (p + u) / 2;
		if (ip <= mij)
			query(2 * nod, p, mij, ip, iu);
		if (mij < iu)
			query(2 * nod + 1, mij + 1, u, ip, iu);
	}

}

int main()
{
	f >> n >> m;

	for (int i = 1; i <= n; i++) {
		f >> x;
		update(1, 1, n, i, x);
	}

	for (int i = 0; i < m; i++) {
		f >> opt;
		if (!opt) {
			f >> pos >> x;
			update(1, 1, n, pos, -x);
		}
		else {
			f >> p >> u;
			sum = 0;
			query(1, 1, n, p, u);
			g << sum << "\n";
		}
	}

	return 0;
}