Cod sursa(job #3328227)

Utilizator AndreiRaresAcatrini Rares Andrei AndreiRares Data 7 decembrie 2025 11:22:05
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.31 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string>       
#include <unordered_map>    
#include <set>    
#include <utility>    
#include <vector>
using namespace std;

#ifdef LOCAL
#define fin cin
#define fout cout
#else
ifstream fin("datorii.in");
ofstream fout("datorii.out");
#endif

int a[15001], aint[60004];

void build(int node, int l, int r) {
	if (l == r) {
		aint[node] = a[l];
		return;
	}
	int mid = (l + r) / 2;
	build(node * 2, l, mid);
	build(node * 2 + 1, mid + 1, r);
	aint[node] = aint[node * 2] + aint[node * 2 + 1];
}

void update(int node, int l, int r, int pos) {
	if (l == r) {
		aint[node] = a[pos];
		return;
	}
	int mid = (l + r) / 2;
	if (pos <= mid) update(node * 2, l, mid, pos);
	else update(node * 2 + 1, mid + 1, r, pos);
	aint[node] = aint[node * 2] + aint[node * 2 + 1];
}

int query(int node, int l, int r, int ql, int qr) {
	if (qr < l || r < ql) return 0;
	if (ql <= l && r <= qr) return aint[node];
	int mid = (l + r) / 2;
	return query(node * 2, l, mid, ql, qr) + query(node * 2 + 1, mid + 1, r, ql, qr);
}

int main() {
	int n, m, t, x, y;
	fin >> n >> m;
	for (int i=1; i<=n; i++) fin >> a[i];
	build(1, 1, n);
	for (int i=1; i<=m; i++) {
		fin >> t >> x >> y;
		if (t == 0) {
			a[x] -= y;
			update(1, 1, n, x);
		}
		else fout << query(1, 1, n, x, y) << '\n';
	}
}