Pagini recente » Cod sursa (job #1768093) | Cod sursa (job #361776) | Cod sursa (job #2034678) | Cod sursa (job #74967) | Cod sursa (job #179939)
Cod sursa(job #179939)
#include <iostream>
#include <fstream>
using namespace std;
#define MIN(a, b) ((a > b) ? (b) : (a))
int N, M;
int A[100001];
void update(int pos, int val)
{
while (pos <= N) {
A[pos] += val;
pos += (pos^(pos-1))&pos;
}
}
int query(int pos)
{
int S(0);
while (pos > 0) {
S += A[pos];
pos -= (pos^(pos-1))&pos;
}
return S;
}
int search(int val)
{
int step;
for (step = 1; step < N; step <<= 1)
;
for (int i(0); step; step >>= 1) {
if (i + step <= N) {
if (val >= A[i+step]) {
i += step;
val -= A[i];
if (!val)
return i;
}
}
}
return -1;
}
int main(int argc, char *argv[])
{
FILE *fi = fopen("aib.in", "r");
fscanf(fi, "%d %d", &N, &M);
int aux;
for (int i(1); i <= N; ++i) {
fscanf(fi, "%d", &aux);
update(i, aux);
}
int op;
int X, Y;
FILE *fo = fopen("aib.out", "w");
while (M--) {
fscanf(fi, "%d", &op);
switch (op) {
case 0:
fscanf(fi, "%d %d", &X, &Y);
update(X, Y);
break;
case 1:
fscanf(fi, "%d %d", &X, &Y);
fprintf(fo, "%d\n", query(Y) - query(X-1));
break;
case 2:
fscanf(fi, "%d", &X);
fprintf(fo, "%d\n", search(X));
}
}
fclose(fo);
fclose(fi);
return 0;
}