#include <stdio.h>
#define MAX_N 100000
int aint[4*MAX_N];
int max(int a, int b) {
if(b > a)
a = b;
return a;
}
void update(int poz, int val, int st, int dr, int nod) {
int m;
if(st == dr)
aint[nod] = val;
else {
m = (st + dr) / 2;
if(poz <= m)
update(poz, val, st, m, nod * 2 + 1);
else
update(poz, val, m + 1, dr, nod * 2 + 2);
aint[nod] = max(aint[nod * 2 + 1], aint[nod * 2 + 2]);
}
}
int query(int st, int dr, int stQ, int drQ, int nod) {
int m, rez;
m = (st + dr) / 2;
if( stQ <= st && dr <= drQ )
return aint[nod];
else {
rez = 0;
if(stQ <= m)
rez = max(rez, query(st, m, stQ, drQ, nod * 2 + 1));
if(drQ >= m + 1)
rez = max(rez, query(m + 1, dr, stQ, drQ, nod * 2 + 2));
return rez;
}
}
int main() {
int i, n, m, com, a, b, x;
FILE *fin = fopen("arbint.in", "r");
fscanf(fin, "%d%d", &n, &m);
for(i = 0; i < n; i++) {
fscanf(fin, "%d", &x);
update(i, x, 0, n - 1, 0);
}
FILE *fout = fopen("arbint.out", "w");
for(i = 0; i < m; i++) {
fscanf(fin, "%d%d%d", &com, &a, &b);
if(com == 0)
fprintf(fout, "%d\n", query(0, n - 1, a - 1, b - 1, 0));
else
update(a - 1, b, 0, n - 1, 0);
}
fclose( fin );
fclose( fout );
return 0;
}