Pagini recente » Cod sursa (job #1044264) | Cod sursa (job #1981956) | Cod sursa (job #2791931) | Borderou de evaluare (job #1185640) | Cod sursa (job #2762611)
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
int n, m;
int aib[100100];
void update(int pos, int val) {
while (pos <= n) {
aib[pos] += val;
pos += pos & -pos;
}
}
int query(int pos) {
int sum = 0;
while (pos > 0) {
sum += aib[pos];
pos -= pos & -pos;
}
return sum;
}
int cautbin(int val) {
int l = 1, r = n, m;
while (l < r) {
m = (l + r) / 2;
int sum = query(m);
if (sum == val) return m;
if (sum < val) l = m+1; else r = m-1;
}
return query(l) == val ? l : -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int op, pos, val, left, right;
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &val);
update(i, val);
}
for (int i = 1; i <= m; ++i) {
scanf("%d", &op);
if (op == 0) {
scanf("%d %d", &pos, &val);
update(pos, val);
} else if (op == 1) {
scanf("%d %d", &left, &right);
printf("%d\n", query(right) - query(left-1));
} else {
scanf("%d", &val);
printf("%d\n", cautbin(val));
}
}
return 0;
}