#include <cstdio>
#define inf (1<<30)
using namespace std;
int n, m;
int v[100000];
void add(int nod, int st, int dr, int a, int b, int val){
if(a <= st && dr <= b){
///actualizare
if(v[nod]<val)v[nod] = val;
}
else{
int mij = (st + dr)/2;
if(a <= mij){
add(2*nod, st, mij, a, b, val);
}
if(b > mij){
add(2*nod+1, mij+1, dr, a, b, val);
}
///actualizare
if(v[nod]<val)v[nod] = val;
}
}
int get(int nod, int st, int dr, int a, int b){
if(st >= a && dr <= b){
return v[nod];
}
else {
int mij = (st+dr)/2;
int s1=-inf, s2=-inf;
if(a <= mij){
s1 = get(2*nod, st, mij, a, b);
}
if(b > mij){
s2 = get(2*nod+1, mij+1, dr, a, b);
}
return s1>s2?s1:s2;
}
}
void update(int nod, int st, int dr, int pos, int val){
if(pos == st && pos == dr){
v[nod]=val;
}
else if(st <= pos && pos <= dr){
int mij = (st+dr)/2;
if(pos<=mij)
update(2*nod, st, mij, pos, val);
if(pos>mij)
update(2*nod+1, mij+1, dr, pos, val);
v[nod] = v[2*nod]>v[2*nod+1]?v[2*nod]:v[2*nod+1];
}
}
int main()
{
FILE* f = fopen("arbint.in", "r");
FILE* f1 = fopen("arbint.out", "w");
fscanf(f, "%d %d", &n, &m);
for(int i=0;i<n;i++){
int x;
fscanf(f, "%d", &x);
add(1, 1, n, i+1, i+1, x);
}
for(int i=0;i<m;i++){
int x, a, b;
fscanf(f, "%d %d %d", &x, &a, &b);
if(x==0)
fprintf(f1, "%d\n", get(1, 1, n, a, b));
if(x==1)
update(1, 1, n, a, b);
}
return 0;
}