#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int ARB[400050];
int maximact;
int maxim(int a,int b){
if(a>b)return a;
return b;
}
void update(int nod,int st,int dr,int pos,int val){
if (st==dr){
ARB[nod]=val;
return;
}
int div=(st+dr)/2;
if(div>=pos)update(2*nod,st,div,pos,val);
else update(2*nod+1,div+1,dr,pos,val);
ARB[nod]=maxim(ARB[nod*2],ARB[nod*2+1]);
}
void query(int nod,int st,int dr,int l,int r){
if(l<=st&&r>=dr){
if(maximact<ARB[nod])maximact=ARB[nod];
return;
}
int div=(st+dr)/2;
if(l<=div) query(nod*2,st,div,l,r);
if(div<r) query(nod*2+1,div+1,dr,l,r);
}
int main()
{int nrnumere,nroperatii;
in>>nrnumere>>nroperatii;
int op,arg1,arg2;
for(int i=1;i<=nrnumere;i++){
in>>arg1;
update(1,1,nrnumere,i,arg1);
}
for(int i=0;i<nroperatii;i++){
in>>op>>arg1>>arg2;
if(op==0){
maximact=-1;
query(1,1,nrnumere,arg1,arg2);
out<<maximact<<"\n";
}
else {
update(1,1,nrnumere,arg1,arg2);
}
}
return 0;
}