Pagini recente » Cod sursa (job #2846079) | Cod sursa (job #789300) | Cod sursa (job #2403375) | Cod sursa (job #820724) | Cod sursa (job #2817972)
#include <stdio.h>
using namespace std;
#define MAXN 100000
int aib[MAXN + 1];
int v[MAXN + 1];
int lastBit(int x) {
return x & -x;
}
void addToSum(int n, int pos, int add) {
aib[pos] += add;
while ( pos + lastBit(pos) <= n ) {
pos += lastBit(pos);
aib[pos] += add;
}
}
int calcSumFromStart(int pos) {
int s;
s = 0;
while ( pos >= 1 ) {
s += aib[pos];
pos -= lastBit(pos);
}
return s;
}
int calcSum(int first, int last) {
return calcSumFromStart(last) - calcSumFromStart(first - 1);
}
int main() {
FILE *fin, *fout;
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
int n, q, i, qnr, a, b, dr, sum, mid, st;
fscanf(fin, "%d%d", &n, &q);
for ( i = 1; i <= n; i++ ) {
fscanf(fin, "%d", &v[i]);
aib[i] += v[i];
if ( i + lastBit(i) <= n ) {
aib[i + lastBit(i)] += aib[i];
}
}
for ( i = 0; i < q; i++ ) {
fscanf(fin, "%d", &qnr);
if ( qnr == 0 ) {
fscanf(fin, "%d%d", &a, &b);
addToSum(n, a, b);
} else if ( qnr == 1 ) {
fscanf(fin, "%d%d", &a, &b);
fprintf(fout, "%d\n", calcSum(a, b));
} else {
fscanf(fin, "%d", &a);
dr = n + 1;
st = 1;
while ( dr - st > 1 ) {
mid = (dr + st) / 2;
sum = calcSumFromStart(mid);
if ( sum <= a ) {
st = mid;
} else {
dr = mid;
}
}
if ( calcSumFromStart(st) == a )
fprintf(fout, "%d\n", st);
else
fprintf(fout, "-1\n");
}
}
return 0;
}