Pagini recente » Cod sursa (job #1636972) | Cod sursa (job #342421) | Cod sursa (job #1593618) | Cod sursa (job #315439) | Cod sursa (job #1460513)
#include <stdio.h>
#define MAX_N 100000
int aint[2 * MAX_N];
int n;
inline int log2(int a) {
int q;
asm("bsr %1, %0" : "=r" (q) : "r" (a));
return q;
}
int sumInt(int a, int b) {
int sum = 0;
a += n;
b += n;
while (a < b) {
if (a & 1) {
sum += aint[a++];
}
if (b & 1) {
sum += aint[--b];
}
a /= 2;
b /= 2;
}
return sum;
}
int main(void) {
FILE *f = fopen("aib.in", "r");
FILE *g = fopen("aib.out", "w");
int m;
char opType;
int a, b;
int k;
fscanf(f, "%d%d", &n, &m);
for (int i = 0; i < n; i++) {
fscanf(f, "%d", &aint[n + i]);
}
for (int i = n - 1; i; i--) { // initializare de jos in sus
aint[i] = aint[2 * i] + aint[2 * i + 1];
}
for (; m; m--) {
fscanf(f, " %c %d", &opType, &a);
if (opType == '1') {
fscanf(f, "%d", &b);
fprintf(g, "%d\n", sumInt(a - 1, b));
} else if (opType == '0') {
fscanf(f, "%d", &b);
a = a + n - 1;
aint[a] += b;
while (a > 1) {
int q = a / 2;
aint[q] += b;
a = q;
}
} else {
k = 0;
for (int step = log2(n); step >= 0; step--) {
if ((k | (1 << step)) <= n && sumInt(0, (k | (1 << step))) < a) {
k |= (1 << step);
}
}
fprintf(g, "%d\n", (sumInt(0, k + 1) == a) ? k + 1 : -1);
}
}
fclose(f);
fclose(g);
return 0;
}