Cod sursa(job #2622834)

Utilizator MicuMicuda Andrei Micu Data 1 iunie 2020 22:12:58
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <iostream>
#include <fstream>

using namespace std;

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

const int NMAX = 15001;
int v[NMAX], tree[4 * NMAX];

void buildTree(int node, int st, int dr) {
	if (st == dr) {
		tree[node] = v[st];
	}
	else {
		int mid = (st + dr) / 2;
		buildTree(node * 2, st, mid);
		buildTree(node * 2 + 1, mid + 1, dr);

		tree[node] = tree[node * 2] + tree[node * 2 + 1];
	}
}

int querySum(int node, int st, int dr, int qst, int qdr) {
	if (qst <= st && dr <= qdr) return tree[node];

	int mid = (st + dr) / 2;
	if (qdr <= mid) return querySum(node * 2, st, mid, qst, qdr);
	else if (qst > mid) return querySum(node * 2 + 1, mid + 1, dr, qst, qdr);
	else {
		return querySum(node * 2, st, mid, qst, qdr) + querySum(node * 2 + 1, mid + 1, dr, qst, qdr);
	}
}

void updateTree(int node, int st, int dr, int pos, int val) {
	if (st == dr) tree[node] -= val;
	else {
		int mid = (st + dr) / 2;
		if (pos <= mid) updateTree(node * 2, st, mid, pos, val);
		else updateTree(node * 2 + 1, mid + 1, dr, pos, val);

		tree[node] = tree[node * 2] + tree[node * 2 + 1];
	}
}

int main() {
	int n, m;
	in >> n >> m;
	for (int i = 0; i < n; i++) in >> v[i];
	buildTree(1, 0, n - 1);
	for (int i = 0; i < m; i++) {
		int t, a, b;
		in >> t >> a >> b;
		if (t == 0) {
			updateTree(1, 0, n - 1, a - 1, b);
		}
		else {
			out << querySum(1, 0, n - 1, a - 1, b - 1) << '\n';
		}
	}

	return 0;
}