Cod sursa(job #1357559)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 23 februarie 2015 23:15:04
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
using namespace std;

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

const int Nmax = 15005;
const int tree_size = 32768;

int n, m;
int values[Nmax];
int tree[tree_size];
int position, value, result;
int op, a, b;

void update(int node, int l, int r) {
	if (l == r)
		tree[node] -= value;
	else {
		int m = (l + r) >> 1;
		if (position <= m) update(node << 1, l, m);
		else update((node << 1) + 1, m + 1, r);
		tree[node] = tree[node << 1] + tree[(node << 1) + 1];
	}
}

void query(int node, int l, int r) {
	if (a <= l && r <= b)
		result += tree[node];
	else {
		int m = (l + r) >> 1;
		if (a <= m) query(node << 1, l, m);
		if (b > m) query((node << 1) + 1, m + 1, r);
	}
}

void construct(int node, int l, int r) {
	if (l == r)
		tree[node] = values[l];
	else {
		int m = (l + r) >> 1;
		construct(node << 1, l, m);
		construct((node << 1) + 1, m + 1, r);
		tree[node] = tree[node << 1] + tree[(node << 1) + 1];
	}
}

int main() {
	in >> n >> m;
	for (int i = 1; i <= n; ++i)
		in >> values[i];
	construct(1, 1, n);

	for (int i = 1; i <= m; ++i) {
		in >> op >> a >> b;
		if (op == 0) {
			position = a;
			value = b;
			update(1, 1, n);
		}
		else {
			result = 0;
			query(1, 1, n);
			out << result << '\n';
		}
	}
	return 0;
}