Cod sursa(job #3350122)

Utilizator minusllIvanus Mihai minusll Data 5 aprilie 2026 17:37:14
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <bits/stdc++.h>
using namespace std;

string name = "datorii";
ifstream in(name + ".in");
ofstream out(name + ".out");

vector<int> st;
int n, m;
int A[15001];

void build(int node, int L, int R) {
	if (L == R) {
		st[node] = A[L];
	}
	else {
		int mid = (L + R) / 2;
		build(node * 2, L, mid);
		build(node * 2 + 1, mid + 1, R);
		st[node] = st[node * 2] + st[node * 2 + 1];
	}
}

void update(int node, int L, int R, int id, int val) {
	if (L == R) {
		A[L] -= val;
		st[node] -= val;
	}
	else {
		int mid = (L + R) / 2;
		if (id <= mid) {
			update(node * 2, L, mid, id, val);
		}
		else {
			update(node * 2 + 1, mid + 1, R, id, val);
		}
		st[node] = st[node * 2] + st[node * 2 + 1];
	}
}

int query(int node, int ql, int qr, int l, int r) {
	if (r < ql or qr < l) return 0;
	if (l <= ql and qr <= r) return st[node];
	int qmid = (ql + qr) / 2;
	return query(node * 2, ql, qmid, l, r) + query(node * 2 + 1, qmid + 1, qr, l, r);
}

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

	st.resize(4 * n);
	build(1, 1, n);

	int c, u, v;
	while (m--) {
		in >> c >> u >> v;
		if (c == 0) update(1, 1, n, u, v);
		else out << query(1, 1, n, u, v) << '\n';
	}
	return 0;
}