#include <fstream>
#define InFile "arbint.in"
#define OutFile "arbint.out"
#define MAXN 100001
using namespace std;
int n,m,X,Y;
struct str
{
int x,y,max;
str *unu,*doi,*tata;
}*p;
str *adr[MAXN],*incepe[MAXN];
void creearearb(int x, int y,str *taticu,int kkt)
{str *q;
q=new str;
if(kkt==1)taticu->unu=q;
else taticu->doi=q;
q->unu=NULL;
q->doi=NULL;
q->tata=taticu;
q->x=x;
if(!incepe[x])incepe[x]=q;
q->y=y;
q->max=0;
if(x==y)adr[x]=q;
else
{
creearearb(x,(x+y)/2,q,1);
creearearb((x+y)/2+1,y,q,2);
}
}
int maxab(int a,int b)
{return a>b?a:b;}
void modificainsus(str *q,int val)
{
if(q->max<val)
{
q->max=val;
if(q->tata)modificainsus(q->tata,val);
}
}
void insus(str*q,int max,int val)
{
if(q->max==max)
{
if(q->unu->max!=val)q->max=q->unu->max;
else q->max=q->doi->max;
q->max=maxab(q->max,val);
if(q->tata)insus(q->tata,max,val);
}
}
void modifica(str *q,int val)
{int max;
max=q->max;
q->max=val;
insus(q->tata,max,val);
}
int maxim(int x,int y)
{str *q;
q=incepe[x];
if(q->y==y)return q->max;
if(q->y<y)return maxab(q->max,maxim(q->y+1,y));
while(q->unu->y>=y)q=q->unu;
if(q->y==y)return q->max;
/*if(q->y<y)*/
return maxab(q->max,maxim(q->y+1,y));
}
void rezolva()
{int i,j,x,a,b,c;
ifstream in(InFile);
in>>n>>m;
p=new str;
creearearb(1,n,p,1);
for(i=1;i<=n;i++)
{
in>>x;
modificainsus(adr[i],x);
}
ofstream out(OutFile);
for(i=1;i<=m;i++)
{
in>>a>>b>>c;
if(a==1)
{
modifica(adr[b],c);
}
else out<<maxim(b,c)<<'\n';
}
out.close();
in.close();
}
int main()
{
rezolva();
return 0;
}