Pagini recente » Cod sursa (job #1557358) | Cod sursa (job #2047697) | Cod sursa (job #2875446) | Cod sursa (job #1364617) | Cod sursa (job #1511460)
#include <bits/stdc++.h>
#define zeroes(x) x ^ (x - 1) & x
using namespace std;
int n;
int h[100005];
void adaug(int where, int what) {
for(int i = where; i <= n; i += zeroes(i)) {
h[i] += what;
}
}
int calc(int poz) {
int s = 0;
for(poz; poz > 0; poz -= zeroes(poz))
s += h[poz];
return s;
}
int caut(int what) {
int i, step;
for(step = 1; step <= n; step <<= 1);
for(i = 0; step; step >>= 1)
if(i + step <= n)
if(calc(i + step) <= what)
i += step;
return i;
}
int main()
{
FILE *f = fopen("aib.in", "r");
FILE *g = fopen("aib.out", "w");
int m, x;
fscanf(f, "%d %d", &n, &m);
for(int i = 1; i <= n; i ++) {
fscanf(f, "%d", &x);
adaug(i, x);
}
int tip, a, b;
for(int i = 1; i <= m; i ++) {
fscanf(f, "%d", &tip);
if(tip == 0) {
fscanf(f, "%d %d", &a, &b);
adaug(a, b);
}
else if(tip == 1) {
fscanf(f, "%d %d", &a, &b);
fprintf(g, "%d\n", calc(b) - calc(a - 1));
}
else {
fscanf(f, "%d", &a);
int poz = caut(a);
if(calc(poz) == a)
fprintf(g, "%d\n", poz);
else fprintf(g, "-1\n");
}
}
return 0;
}