Pagini recente » Cod sursa (job #2910949) | Cod sursa (job #778466) | Cod sursa (job #2070967) | Cod sursa (job #1352356) | Cod sursa (job #2077752)
#include <cstdio>
#include <vector>
#include <cstring>
using namespace std;
#define NMAX 100001
int N, M;
int tree[NMAX];
void Update(int idx, int val) {
while (idx <= N) {
tree[idx] += val;
idx += (idx & -idx);
}
}
int Query(int idx) {
int sum = 0;
while (idx > 0) {
//printf("%d %d %d\n", sum, idx, tree[idx]);
sum += tree[idx];
idx -= (idx & -idx);
//printf("%d %d %d\n", sum, idx, tree[idx]);
}
return sum;
}
int Search(int val) {
int i, step;
for (step = 1; step <= N; step <<= 1) ;
for (i = 0; step; step >>= 1) {
if (i + step <= N) {
if (val >= tree[i + step]) {
i += step;
val -= tree[i];
if (val == 0) {
return i;
}
}
}
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d %d", &N, &M);
memset(tree, 0, sizeof(tree));
int val;
for (int i = 1; i <= N; i++) {
scanf("%d ", &val);
Update(i, val);
//printf("%d ", tree[i]);
}
int op;
for (; M; M--) {
scanf("%d", &op);
if (op < 2) {
int x, y;
scanf("%d %d ", &x, &y);
if (op == 0) {
Update(x, y);
} else {
//printf("%d %d\n", x, y);
printf("%d\n", Query(y) - Query(x - 1));
}
} else {
int x;
scanf("%d ", &x);
printf("%d\n", Search(x));
}
}
return 0;
}