Cod sursa(job #3146374)

Utilizator moldovan_robert_lolMoldovan Robert moldovan_robert_lol Data 20 august 2023 16:52:22
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.07 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <utility>
#include <algorithm>

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

int x, q;
int tree[60005];

void build_tree(int node, int l, int r) {
	if (l==r) {
		fin >> tree[node];
		return;
	}

	int m = (l+r)>>1;
	build_tree(node<<1,l,m);
	build_tree(node<<1|1,m+1,r);
	tree[node] = tree[node<<1] + tree[node<<1|1];
}

void update(int node, int l, int r, int poz, int val) {
	if (l==r) {
		tree[node] -= val;
		return;
	}

	int m = (l+r)>>1;
	if (poz<=m) update(node<<1,l,m,poz,val);
	if (poz>m) update(node<<1|1,m+1,r,poz,val);
	tree[node] = tree[node<<1] + tree[node<<1|1];
}

int query(int node, int l, int r, int st, int fi) {
	if (l>fi||r<st) return 0;
	if (st<=l&&r<=fi) {
		return tree[node];
	}

	int m = (l+r)>>1;
	return query(node<<1,l,m,st,fi) + query(node<<1|1,m+1,r,st,fi);
}

int main() {
	fin >> x >> q;
	build_tree(1,1,x);
	while (q--) {
		int op, a, b;
		fin >> op >> a >> b;
		if (op==0) {
			update(1,1,x,a,b);
		}
		else {
			fout << query(1,1,x,a,b) << "\n";
		}
	}
}