#include <iostream>
#include <cstdio>
#define N 100005
using namespace std;
int n,m,c,a,b;
int s[N], arbint[4*N];
void construieste(int st = 1, int dr = n, int pos = 1){
if(st==dr){
arbint[pos] = s[st];
return ;
}
int mij = (st+dr)/2;
construieste(st,mij,2*pos);
construieste(mij+1,dr,2*pos+1);
arbint[pos]=max(arbint[2*pos],arbint[2*pos+1]);
}
void actualizare(int k, int st = 1, int dr = n, int pos = 1){
if(st==dr){
arbint[pos] = s[k];
return ;
}
int mij = (st+dr)/2;
if(k<=mij)
actualizare(k,st,mij,2*pos);
else
actualizare(k,mij+1,dr,2*pos+1);
arbint[pos]=max(arbint[2*pos],arbint[2*pos+1]);
}
int cauta(int st = 1, int dr = n, int pos = 1){
if(a<=st && dr<=b)
return arbint[pos];
int mij=(st+dr)/2;
if(b<=mij)
return cauta(st,mij,2*pos);
if(a>mij)
return cauta(mij+1,dr,2*pos+1);
return max(cauta(st,mij,2*pos),
cauta(mij+1,dr,2*pos+1));
}
int main(){
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d", &n,&m);
for(int i=1;i<=n;++i)
scanf("%d", &s[i]);
construieste();
for(int i=0;i<m;++i){
scanf("%d%d%d", &c,&a,&b);
if(c==1){
s[a]=b;
actualizare(a);
}else
printf("%d\n", cauta());
}
return 0;
}