#include <cstdio>
int N, M, a, b;
int v[200055];
int max(int a, int b);
void update(int val, int li, int ls);
int query(int pos, int li, int ls);
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (a=1; a<=N; ++a){
scanf("%d", &b);
update(1, 1, N);
}
for (int i=1; i<=M; ++i){
int op;
scanf("%d %d %d", &op, &a, &b);
if (!op){
printf("%d\n", query(1, 1, N));
}
else{
update(1, 1, N);
}
}
return 0;
}
int max(int a, int b){
return a>b ? a : b;
}
void update(int pos, int li, int ls){
if (li<ls){
int m=(li+ls)/2;
if (a<=m){
update(2*pos, li, m);
}
else{
update(2*pos+1, m+1, ls);
}
v[pos] = max(v[2*pos], v[2*pos+1]);
}
else{
v[pos] = b;
}
}
int query(int pos, int li, int ls){
if (a<=li && b>=ls){
return v[pos];
}
int m=(li+ls)/2;
if (a>m){
return query(2*pos+1, m+1, ls);
}
else if (b<=m){
return query(2*pos, li, m);
}
else{
return max(query(2*pos, li, m), query(2*pos+1, m+1, ls));
}
}