Pagini recente » Cod sursa (job #2182857) | Cod sursa (job #1826732) | Cod sursa (job #2870899) | Cod sursa (job #46048) | Cod sursa (job #714196)
Cod sursa(job #714196)
#include <cstring>
#include <cstdio>
#include <cmath>
int n, m, l;
int heap[262144];
int level(int n) {
int level = 1;
while (n > level) {
level *= 2;
}
return(level);
}
int add(int at, int val) {
at = at + l - 1;
while (at) {
heap[at] += val;
at /= 2;
}
}
int search(int nod, int val) {
while (nod < l) {
if (val < heap[nod]) {
nod = nod * 2;
} else {
nod = nod * 2 + 1;
}
}
return(nod - l + 1);
}
int sum(int left, int right) {
left = l + left - 1;
right = l + right - 1;
int sum = 0;
while (left < right) {
if (left % 2 == 0 && right % 2 == 1) {
left /= 2;
right /= 2;
} else {
if (left % 2) {
sum += heap[left];
++left;
} else {
sum += heap[right];
--right;
}
}
}
sum += heap[left];
return(sum);
}
int main() {
FILE * in = fopen("aib.in", "rt");
FILE * out = fopen("aib.out", "wt");
fscanf(in, "%d%d", &n, &m);
l = level(n);
for (int i = 0; i < n; ++i) {
fscanf(in, "%d", &heap[l + i]);
}
for (int i = l - 1; i > 0; --i) {
heap[i] = heap[i * 2] + heap[i * 2 + 1];
}
int a, b, c;
for (int i = 0; i < m; ++i) {
fscanf(in, "%d", &a);
if (a == 2) {
fscanf(in, "%d", &b);
fprintf(out, "%d\n", search(1, b));
} else {
fscanf(in, "%d%d", &b, &c);
if (a) {
fprintf(out, "%d\n", sum(b, c));
} else {
add(b, c);
}
}
}
fclose(in);
fclose(out);
}