#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int x,y,vec[400000],ai[30000],N,M,sol;
class arb
{
public:
void creare(int st,int dr,int pai);
void cautare(int st,int dr,int pai);
void refresh(int st,int dr,int pai);
};
void arb::creare(int st,int dr,int pai)
{
if(st==dr)
{
ai[pai]=vec[st];
return ;
}
int mij=(st+dr)/2;
creare(st,mij,2*pai);
creare(mij+1,dr,2*pai+1);
ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}
void arb::cautare(int st,int dr,int pai)
{
if(x<=st&&dr<=y)
{
sol=max(ai[pai],sol);
return ;
}
int mij=(st+dr)/2;
if(x<=mij)
cautare(st,mij,2*pai);
if(y>mij)
cautare(mij+1,dr,2*pai+1);
}
void arb::refresh(int st,int dr,int pai)
{
if(st==dr)
{
ai[pai]=y;
return ;
}
int mij=(st+dr)/2;
if(x<=mij)
refresh(st,mij,2*pai);
if(x>mij)
refresh(mij+1,dr,2*pai+1);
ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}
void citire()
{
scanf("%d %d",&N,&M);
arb arbore;
for(int i=1;i<=N;i++)
scanf("%d",&vec[i]);
arbore.creare(1,N,1);
for(int i=0;i<M;i++)
{
int p;
scanf("%d%d%d",&p,&x,&y);
if(p==1)
arbore.refresh(1,N,1);
else
{
sol=0;
arbore.cautare(1,N,1);
printf("%d\n",sol);
}
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
// cout << "Hello world!" << endl;
return 0;
}