Pagini recente » Cod sursa (job #2901652) | Cod sursa (job #1805350) | Cod sursa (job #1662115) | Cod sursa (job #683570) | Cod sursa (job #3216285)
// Mihai Priboi
#include <stdio.h>
#define MAX_N 100000
#define LOG_N 17
int v[MAX_N + 1];
inline int lsb(int x) { return x & -x; }
void init(int n) {
for (int i = 1; i <= n; i++)
if (i + lsb(i) <= n)
v[i + lsb(i)] += v[i];
}
void add(int x, int val, int n) {
while (x <= n) {
v[x] += val;
x += lsb(x);
}
}
int query(int x) {
int r = 0;
while (x > 0) {
r += v[x];
x -= lsb(x);
}
return r;
}
int query(int a, int b) {
return query(b) - query(a - 1);
}
int bs(int x, int n) {
int r, pas, s;
r = s = 0;
pas = 1 << LOG_N;
while (pas) {
if (r + pas <= n && s + v[r + pas] <= x) {
r += pas;
s += v[r];
}
pas /= 2;
}
return s == x && s != 0 ? r : -1;
}
int main() {
FILE *fin, *fout;
int n, q;
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
fscanf(fin, "%d%d", &n, &q);
for (int i = 1; i <= n; i++)
fscanf(fin , "%d", &v[i]);
init(n);
while (q--) {
int c, a, b;
fscanf(fin, "%d%d", &c, &a);
if (c == 0) {
fscanf(fin, "%d", &b);
add(a, b, n);
} else if (c == 1) {
fscanf(fin, "%d", &b);
fprintf(fout, "%d\n", query(a, b));
} else {
fprintf(fout, "%d\n", bs(a, n));
}
}
fclose(fin);
fclose(fout);
return 0;
}