Pagini recente » Cod sursa (job #3208282) | Cod sursa (job #2258357) | Cod sursa (job #1753502) | Cod sursa (job #1002440) | Cod sursa (job #713681)
Cod sursa(job #713681)
#include <cstring>
#include <cstdio>
#include <cmath>
#define max(a, b) (a > b) ? a : b
int level(int n) {
int level = 1;
while (n > level) level <<= 1;
return(level);
}
int n, m, l;
int heap[262144];
void change(int id, int val) {
id = l + id;
heap[id] = val;
while (id /= 2) {
heap[id] = max(heap[id * 2], heap[id * 2 + 1]);
}
}
int maximum(int left, int right) {
int maximum = 0;
while (left < right) {
if (left % 2 == 0 && right % 2 == 1) {
if (maximum < heap[left]) maximum = heap[left];
if (maximum < heap[right]) maximum = heap[right];
left /= 2;
right /= 2;
} else {
if (left % 2) {
if (maximum < heap[left]) maximum = heap[left];
++left;
} else {
if (maximum < heap[right]) maximum = heap[right];
--right;
}
}
}
if (maximum < heap[left]) maximum = heap[left];
return(maximum);
}
int main() {
FILE * in = fopen("arbint.in", "rt");
FILE * out = fopen("arbint.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] = max(heap[i * 2], heap[i * 2 + 1]);
}
int a, b, c;
for (int i = 0; i < m; ++i) {
fscanf(in, "%d%d%d", &a, &b, &c);
if (a) {
change(b - 1, c);
} else {
printf("%d\n", maximum(l + b - 1, l + c - 1));
}
}
fclose(in);
fclose(out);
}