Pagini recente » Cod sursa (job #561246) | Cod sursa (job #455895) | Cod sursa (job #1382643) | Cod sursa (job #161657) | Cod sursa (job #2152314)
#include <cstdio>
#define MAXN 100005
using namespace std;
FILE *fin, *fout;
int aib[MAXN * 4], N;
inline void Update(int poz, int val) {
for (int i = poz; i <= N; i += i & (-i))
aib[i] += val;
}
inline int Query(int a, int b) {
int sol = 0;
for (int i = b; i; i -= i & (-i))
sol += aib[i];
for (int i = a - 1; i; i-= i & (-i))
sol -= aib[i];
return sol;
}
inline int binarySearch(int a) {
int ii, step, aux, poz = MAXN + 10;
for (step = 1; step <= N; step <<= 1);
for (ii = 0; step; step >>= 1) {
if (ii + step <= N) {
aux = Query(1, step + ii);
if (aux < a)
step += ii;
else if (aux == a) {
if (poz > ii + step)
poz = ii + step;
}
}
}
if (poz == MAXN + 10)
poz = -1;
return poz;
}
inline void Read() {
int M, tip, a, b, x;
fscanf(fin, "%d %d", &N, &M);
for (int i = 1; i <= N; i++) {
fscanf(fin, "%d", &x);
Update(i, x);
}
while (M--) {
fscanf(fin, "%d", &tip);
if (tip == 0) {
fscanf(fin, "%d %d", &a, &b);
Update(a, b);
}
else if (tip == 1) {
fscanf(fin, "%d %d", &a, &b);
fprintf(fout, "%d\n", Query(a, b));
}
else {
fscanf(fin, "%d", &a);
fprintf(fout, "%d\n", binarySearch(a));
}
}
}
int main () {
fin = fopen("aib.in", "r");
fout = fopen("aib.out", "w");
Read();
fclose(fin); fclose(fout); return 0;
}