#include <cstdio>
#include <algorithm>
#define nmax 100001
using namespace std;
int arb[nmax*3], sol=0;
void query(int nod, int st, int dr, int a, int b){
if (a <= st && dr <= b){// daca intervalul [a,b] e inclus in [st,dr];
sol=max(sol,arb[nod]);
return;
}
int mij=(st + dr) / 2;
if (a <= mij) query(nod*2, st, mij, a, b);
if (b > mij) query(nod*2+1, mij+1, dr, a, b);
}
void udpate(int nod, int st, int dr, int poz, int val){
if (st == dr){
arb[nod]=val;
return;
}else{
int mij=(st+dr)/2;
if (poz <= mij) udpate(nod*2,st, mij, poz, val);
else udpate(nod*2+1, mij+1, dr, poz, val);
}
arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m;
scanf("%d %d\n",&n,&m);
for(int i=1;i<=n;i++){
int x;
scanf("%d",&x);
udpate(1,1,n,i,x);
}
for(int i=1;i<=m;i++){
int tip, x, y;
sol=0;
scanf("%d %d %d\n", &tip, &x, &y);
if (tip==0){
query(1,1,n,x,y);
printf("%d\n",sol);
}else if (tip) udpate(1,1,n,x,y);
}
//for(int i=1;i<=n;i++) printf("%d ",arb[i]);
return 0;
}