Pagini recente » Cod sursa (job #534024) | Cod sursa (job #2108809) | Cod sursa (job #2382387) | Cod sursa (job #1639675) | Cod sursa (job #1972274)
#include <cstdio>
int N, M;
const int MAX_N = 100000;
int aib[5 + MAX_N];
int terminal0(int x) {
return (x ^ (x - 1)) & x;
}
void add(int poz, int val) {
for (int i = poz; i <= N; i += terminal0(i)) {
aib[i] += val;
}
}
int compute(int poz) {
int s = 0;
for (int i = poz; i >= 1; i -= terminal0(i))
s += aib[i];
return s;
}
int binarySearch(int x) {
int st, dr, last = -1;
st = 1;
dr = N;
while (st <= dr) {
int med = (st + dr) / 2;
int val = compute(med);
if (val < x) {
st = med + 1;
} else {
if (val == x) {
last = med;
}
dr = med - 1;
}
}
return last;
}
int main() {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
scanf("%d%d", &N, &M);
for (int i = 1; i <= N; ++i) {
int x;
scanf("%d", &x);
add(i, x);
}
for (int i = 1; i <= M; ++i) {
int tip, a;
scanf("%d%d", &tip, &a);
if (tip == 2) {
printf("%d\n", binarySearch(a));
} else {
int b;
scanf("%d", &b);
if (tip == 0) {
add(a, b);
} else {
printf("%d\n", compute(b) - compute(a - 1));
}
}
}
return 0;
}