Pagini recente » Cod sursa (job #139547) | Borderou de evaluare (job #1959821) | Cod sursa (job #1923482) | Cod sursa (job #407849) | Cod sursa (job #1553041)
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
class Fenwick {
vector<int> a;
int n;
int msb;
public:
Fenwick(int n) : n(n) {
a.resize(n+1);
for (int i = 1; i <= n; ++i) {
cin >> a[i];
}
for (msb = 1; msb*2 <= n; msb *= 2);
for (int stp = 2; stp <= n; stp *= 2)
for (int i = stp; i <= n; i += stp)
a[i] += a[i-stp/2];
}
void update(int idx, int val) {
idx++;
while (idx <= n) {
a[idx] += val;
idx += idx & -idx;
}
}
int getsum(int lo, int hi) {
int sum = 0;
while (hi > lo) {
sum += a[hi];
hi &= hi-1;
}
while (lo > hi) {
sum -= a[lo];
lo &= lo-1;
}
return sum;
}
int idx_of_sum(int sum) {
int idx = 0;
for (int stp = msb; stp > 0; stp /= 2) {
idx += stp;
if (idx <= n && sum >= a[idx]) {
sum -= a[idx];
if (sum == 0) return idx;
}
else idx -= stp;
}
return -1;
}
};
int main() {
ios::sync_with_stdio(false);
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int n, m;
cin >> n >> m;
Fenwick bit(n);
int op, idx, lo, hi, val;
for (int i = 0; i < m; ++i) {
cin >> op;
if (op == 0) {
cin >> idx >> val;
idx--;
bit.update(idx, val);
}
else if (op == 1) {
cin >> lo >> hi;
lo--;
printf("%d\n", bit.getsum(lo, hi));
}
else if (op == 2) {
cin >> val;
printf("%d\n", bit.idx_of_sum(val));
}
}
}