Pagini recente » Cod sursa (job #921716) | Cod sursa (job #2749268) | Cod sursa (job #2449298) | Cod sursa (job #3004030) | Cod sursa (job #2819176)
#include <stdio.h>
#define NMAX 100001
#define LOGN 31
int v[NMAX];
int aib[NMAX];
int n;
static inline int op(int x) {
return (x&(-x));
}
void update(int poz, int val) {
while (poz <= n) {
aib[poz] += val;
poz += op(poz);
}
}
int search(int val) {
int poz, pas, sum;
sum = 0;
poz = 0;
pas = 1<<LOGN;
while (pas>0) {
if (poz+pas<=n && sum+aib[poz+pas]<=val) {
sum += aib[poz+pas];
poz += pas;
}
pas/=2;
}
if (sum!=val || poz==0) {
return -1;
}
return poz;
}
int query(int x) {
int rez;
rez = 0;
while (x>0) {
rez += aib[x];
x -= op(x);
}
return rez;
}
int main() {
FILE *fin, *fout;
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
int m, i, q, a, b;
fscanf(fin, "%d%d", &n, &m);
for (i=1; i<=n; i++) {
fscanf(fin, "%d", &v[i]);
}
for (i=1; i<=n; i++) {
aib[i] += v[i];
if (i+op(i) <= n) {
aib[i+op(i)] += aib[i];
}
}
for (i=0; i<m; i++) {
fscanf(fin, "%d", &q);
if (q==0) {
fscanf(fin, "%d%d", &a, &b);
update(a, b);
} else if (q==1) {
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", query(b)-query(a-1));
} else if (q==2) {
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", search(a));
}
}
fclose(fin);
fclose(fout);
return 0;
}