Pagini recente » Cod sursa (job #1568664) | Profil Anna123 | Monitorul de evaluare | Cod sursa (job #397345) | Cod sursa (job #179957)
Cod sursa(job #179957)
#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 p = 1,
r = N;
int q,
qval;
while (p < r) {
q = p + (r - p) / 2;
qval = query(q);
if (qval < val)
p = q + 1;
else
r = q;
}
if (A[p] == val)
return p;
else
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;
}