#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
typedef int arbint[2000005];
arbint arbore;
int n,m,x,y,z,maxim;
void update(int val,int poz,int nod,int left,int right)
{
if(left == right){
arbore[nod] = val;
return;
}
int m = (left+right)/2;
if(poz <= m) update(val,poz,nod*2,left,m);
if(poz > m) update(val,poz,nod*2+1,m+1,right);
arbore[nod] = max(arbore[nod*2],arbore[nod*2+1]);
}
void query(int nod,int left,int right,int start,int finish)
{
if(start <= left && right <= finish){
maxim = max(maxim,arbore[nod]);
return;
}
int m = (left+right)/2;
if(start <= m) query(nod*2,left,m,start,finish);
if(m < finish) query(nod*2+1,m+1,right,start,finish);
}
int main()
{
in>>n>>m;
for(int i = 1 ; i <= n ; i++){
in>>x;
update(x,i,1,1,n);
}
for(int i = 1 ; i <= m ; i++){
in>>x>>y>>z;
if(x == 1)
update(z,y,1,1,n);
else{
maxim = -1;
query(1,1,n,y,z);
out<<maxim<<"\n";
}
}
return 0;
}