Pagini recente » Cod sursa (job #1376937) | Cod sursa (job #1267856) | Cod sursa (job #2600764) | Cod sursa (job #2816640) | Cod sursa (job #1444598)
#include <cstdio>
#include <cassert>
#include <algorithm>
#define _submit
#ifdef _submit
#define InFile "arbint.in"
#define OutFile "arbint.out"
#else
#define InFile "fis.in"
#define OutFile "fis.out"
#endif
#define MAXARBSZ 300000
int arbInt[MAXARBSZ];
int arbSz;
int gudSz(int n) {
int p = 1;
while (p < n)
p <<= 1;
return p;
}
int max3(int a, int b, int c) {
return std::max(a, std::max(b, c));
}
void update(int pos, int x) {
pos += arbSz - 1;
arbInt[pos] = x;
pos >>= 1;
while (pos) {
int aux = std::max(arbInt[pos << 1], arbInt[(pos << 1) + 1]);
if (arbInt[pos] == aux)
break;
arbInt[pos] = aux;
pos >>= 1;
}
}
int query(int left, int right) {
left += arbSz - 1;
right += arbSz - 1;
int result = -1;
while (left <= right) {
result = max3(arbInt[left], arbInt[right], result);
left = (left + 1) >> 1;
right = (right - 1) >> 1;
}
return result;
}
int main() {
assert(freopen(InFile, "r", stdin));
assert(freopen(OutFile, "w", stdout));
int N, M;
scanf("%d%d", &N, &M);
arbSz = gudSz(N);
for (int i = arbSz; i < arbSz + N; i++)
scanf("%d", &arbInt[i]);
for (int i = arbSz + N; i< (arbSz << 1); i++)
arbInt[i] = -1;
for (int i = arbSz - 1; i > 0; i--)
arbInt[i] = std::max(arbInt[i << 1], arbInt[(i << 1) + 1]);
for (int i = 0; i < M; i++) {
int o, a, b;
scanf("%d%d%d", &o, &a, &b);
if (o == 0)
printf("%d\n", query(a, b));
else
update(a, b);
}
return 0;
}