Pagini recente » Cod sursa (job #1436437) | Cod sursa (job #1619084) | Cod sursa (job #1915852) | Cod sursa (job #1896690) | Cod sursa (job #2817749)
#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) {
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, dif, sum;
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);
sum = -1;
dr = n;
dif = n / 2;
while ( dif > 0 && sum != a ) {
sum = calcSumFromStart(dr);
if ( sum > a ) {
dr -= dif;
}
if ( sum < a )
dr += dif;
dif /= 2;
}
if ( sum != a )
sum = calcSumFromStart(dr);
if ( sum == a )
fprintf(fout, "%d\n", dr);
else
fprintf(fout, "-1\n");
}
}
return 0;
}