Pagini recente » Cod sursa (job #50688) | Cod sursa (job #268080) | Cod sursa (job #1165394) | Cod sursa (job #538805) | Cod sursa (job #3287420)
#include <fstream>
using namespace std;
const int NMAX = 15005;
int n, m;
int a[NMAX]; // valorile inițiale
int AIB[NMAX]; // arborele indexat binar
// adaugă valoare 'val' la poziția 'pos' în AIB
void update(int pos, int val) {
while (pos <= n) {
AIB[pos] += val;
pos += (pos & -pos);
}
}
// calculează suma de la 1 la pos
int query(int pos) {
int suma = 0;
while (pos > 0) {
suma += AIB[pos];
pos -= (pos & -pos);
}
return suma;
}
// suma pe intervalul [p, q]
int sum_interval(int p, int q) {
return query(q) - query(p - 1);
}
int main() {
ifstream cin("datorii.in");
ofstream cout("datorii.out");
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
// citim valorile inițiale
for (int i = 1; i <= n; ++i) {
cin >> a[i];
update(i, a[i]);
}
int tip, p, q;
for (int i = 0; i < m; ++i) {
cin >> tip >> p >> q;
if (tip == 0) {
// persoana p plătește q (scădem q din a[p])
update(p, -q);
} else {
// suma pe intervalul [p, q]
cout << sum_interval(p, q) << '\n';
}
}
return 0;
}