#include <iostream>
#include <cstdio>
using namespace std;
int v[100001],arbore[200002],k,n,maxim,m,maximul,c,d,x,k2;
void care_imaximul(int l,int st,int dr,int a ,int b){
if(l<=k){
if(a==st && b==dr){
maximul=arbore[l];
}
if(st<=a || b<=dr){
care_imaximul(2*l,st,(st+dr)/2,a,b);
care_imaximul(2*l+1,(st+dr)/2+1,dr,a,b);
}
if(a<=st && dr<=b){
if(arbore[l]>maximul){
maximul=arbore[l];
}
}
}}
void facem_arborele(int l,int a,int b){
k++;maxim=-1;
for(int i=a;i<=b;i++){
if(v[i]>maxim){
maxim=v[i];
}
}
arbore[l]=maxim;
if(a!=b){
facem_arborele(2*l,a,(a+b)/2);
facem_arborele(2*l+1,(a+b)/2+1,b);
}
}
void actualizare(int l,int st,int dr, int a,int b){ //ACTUALIZEAZA ASTA DOAR CU UN NUMAR DIN SIR!!!
// fa arbore cand scoti maximul si nu il poti inlocui cu celalalt!
if(l<=k2){
if(st<=a && a<=dr){
if(v[a]>arbore[l]){
arbore[l]=v[a];
}
if(arbore[l]==v[b]&& (st>b || b>dr)){
k=l-1;
facem_arborele(l,st,dr);
}
}
if(st<=b && b<=dr){
if(v[b]>arbore[l]){
arbore[l]=v[b];
}
if(arbore[l]==v[a]&& (st>a || a>dr)){
k=l-1;
facem_arborele(l,st,dr);
}
}
if((st<=a && a<=dr)|| (st<=b && b<=dr)){
actualizare(2*l,st,(st+dr)/2,a,b);
actualizare(2*l+1,(st+dr)/2+1,dr,a,b);
}
}
}
int main()
{
FILE*in =fopen("arbore.in","r");
FILE*out=fopen("arbore.out","w");
fscanf(in,"%d%d",&n,&m);
for(int j=1;j<=n;j++){
fscanf(in,"%d",&v[j]);
}
facem_arborele(1,1,n);
//fscanf(in,"%d%d",&c,&d);
maximul=0;
k2=k;
while(m!=0){
fscanf(in,"%d",&x);
m--;
if(x==0){
maximul=0;
fscanf(in,"%d%d",&c,&d);
care_imaximul(1,1,n,c,d);
fprintf(out,"%d\n",maximul);
}
if(x==1){
fscanf(in,"%d%d",&c,&d);
v[c]=d;
//actualizare(1,1,n,c,d);
k=0;
facem_arborele(1,1,n);
// fprintf(out,"ARBORE\n");
// for(int i=1;i<=k;i++){
// fprintf(out,"%d\n",arbore[i]);}
}
}
fclose(in);
fclose(out);
}