Pagini recente » Cod sursa (job #910831) | Cod sursa (job #2293166) | Cod sursa (job #1490603) | Cod sursa (job #3211071) | Cod sursa (job #2282544)
#include <stdio.h>
const int NMAX = 100005;
const int MMAX = 150005;
int N, M;
int arb[NMAX];
void create_aib() {
for (int ix = 1; ix <= N; ++ix) {
int ix2 = ix + (ix & (-ix));
if (ix2 <= N) {
arb[ix2] += arb[ix];
}
}
}
void update(int ix, int val) {
while (ix <= N) {
arb[ix] += val;
ix += ix & (-ix);
}
}
int prefix(int ix) {
int result = 0;
while (ix >= 1) {
result += arb[ix];
ix -= ix & (-ix);
}
return result;
}
int range(int ix1, int ix2) {
return prefix(ix2) - prefix(ix1 - 1);
}
int search(int val) {
int lgN;
for (lgN = 1; lgN < N; lgN <<= 1);
for (int step = lgN, i = 0; step; step >>= 1) {
if ( i + step <= N && arb[i + step] <= val) {
val -= arb[i+step];
i += step;
}
if (val == 0 && i != 0) {
return i;
}
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; ++i) {
scanf("%d",&arb[i]);
}
create_aib();
for (int i = 0; i < M; ++i) {
int m;
scanf("%d", &m);
if (m == 0) {
int n1, n2;
scanf("%d%d", &n1, &n2);
update(n1, n2);
} else if (m == 1) {
int n1, n2;
scanf("%d%d", &n1, &n2);
printf("%d\n", range(n1, n2));
} else {
int n1;
scanf("%d", &n1);
printf("%d\n", search(n1));
}
}
return 0;
}