#include <stdio.h>
#include <algorithm>
using namespace std;
#define Nmax 100005
int arb[Nmax<<2];
int i, n, nr, s, d, val, poz, q, a, b, sol;
void update(int nod, int s, int d){
if (s == d){
arb[nod] = val;
return ;
}
int m = (s+d)/2;
if (poz <= m)
update(2*nod, s, m);
else
update(2*nod+1, m+1, d);
arb[nod] = max (arb[2*nod], arb[2*nod+1]);
}
void query(int nod, int s, int d){
if (a <= s && d <= b){
sol = max(sol,arb[nod]);
return ;
}
int m = (s+d)/2;
if (a <= m)
query (2*nod, s, m);
if (m < b)
query (2*nod+1, m+1, d);
}
int main (){
FILE * f = fopen ("arbint.in", "r");
FILE * g = fopen ("arbint.out", "w");
fscanf(f, "%d %d", &n, &nr);
for (i = 1 ; i <= n ; i++){
poz = i;
fscanf (f, "%d", &val);
update(1,1,n);
}
for (i = 1 ; i <= nr; i++){
fscanf(f, "%d %d %d", &q, &a, &b);
if (q == 0){
sol = 0;
query(1,1,n);
fprintf(g, "%d\n", sol);
}
if (q == 1){
poz = a;
val = b;
update(1,1,n);
}
}
fclose(f);
fclose(g);
return 0;
}