Pagini recente » Cod sursa (job #1964771) | Cod sursa (job #1059934) | Cod sursa (job #1059975) | Cod sursa (job #2099399) | Cod sursa (job #1493193)
#include <cstdio>
using namespace std;
#define NMAX 100010
int aib[NMAX];
int N, M;
int v[NMAX];
void update (int poz, int val) {
for (int i = poz; i <= N; i += (i^(i&(i-1)))) {
aib[i] += val;
}
}
int query (int poz) {
int ans = 0; // suma de la 1 la poz
for (int i = poz; i > 0; i -= (i^(i&(i-1)))) {
ans += aib[i];
}
return ans;
}
int binSearch (int sum) {
int i, pas = 1<<17;
for (i = 0; pas > 0; pas>>=1) {
if (i + pas <= N) {
if (sum >= aib[i + pas]) {
i += pas;
sum -= aib[i];
if (sum == 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", &v[i]);
update (i, v[i]);
}
int tip, X, Y;
while (M--) {
scanf ("%d", &tip);
if (tip == 0) {
scanf ("%d%d", &X, &Y);
update (X, Y);
}
else {
if (tip == 1) {
scanf ("%d%d", &X, &Y);
printf ("%d\n", query (Y) - query (X - 1));
}
else {
scanf ("%d", &X);
printf ("%d\n", binSearch (X));
}
}
}
return 0;
}