#include <stdio.h>
#include <stdlib.h>
#define N_MAX 100000
#define MAX(a,b) (((a)>(b))?(a):(b))
int arbore[N_MAX * 2 + 1];
void update(int nod, int left, int right, int val, int pos) {
if ( left == right ) {
arbore[nod] = val;
return;
}
int mid = (left + right) / 2;
if (mid >= pos) {
update(2 * nod, left, mid, val, pos);
}
else {
update(2 * nod + 1, mid + 1, right, val, pos);
}
arbore[nod] = MAX( arbore[2 * nod], arbore[2 * nod + 1]);
}
int query(int nod, int left, int right, int start, int finish) {
if ( start <= left && right <= finish )
return arbore[nod];
int mid = (left + right) / 2;
int x = 0, y = 0;
if (start <= mid)
x = query(2 * nod, left, mid, start, finish);
if (mid < finish)
y = query(2 * nod + 1, mid + 1, right, start, finish);
return MAX(x,y);
}
int main()
{
FILE *in = fopen("arbint.in", "r");
FILE *out = fopen("arbint.out", "w");
int n, m;
fscanf(in, "%d %d", &n, &m);
int i;
int x;
for (i = 1; i <= n; i++) {
fscanf(in, "%d", &x);
update(1, 1, n, x, i);
}
int operatie, a, b;
for (i = 1; i <= m; i++) {
fscanf(in, "%d %d %d", &operatie, & a, &b);
if (operatie == 0)
fprintf(out, "%d\n", query(1, 1, n, a, b));
else
update(1, 1, n, b, a);
}
return 0;
}