using namespace std;
#include<iostream>
#include<fstream>
#define common int L=2*n,R=L+1,m=(l+r)/2
int T,N,H[300000],full[300000];
int a[100005];
int sol;
ofstream fout("arbint.out");
int query(int n,int l,int r,int ql,int qr)
{
if(full[n])
{
return H[n];
}
if(ql<=l && r<=qr)
{
return H[n];
}
common;
int x=-0x3f3f3f3f;
if(ql<=m)
{
x=query(L,l,m,ql,qr);
}
if(qr>=m+1)
{
x=max(x,query(R,m+1,r,ql,qr));
}
return x;
}
void update(int n,int l,int r,int ql,int qr,int v)
{
if(ql<=l && r<=qr)
{
H[n]=v;
full[n]=1;
return;
}
common;
if(full[n])
{
full[n]=0;
full[L]=full[R]=1;
H[L]=H[R]=H[n];
}
if(ql<=m)
update(L,l,m,ql,qr,v);
if(qr>=m+1)
update(R,m+1,r,ql,qr,v);
if(H[L]==H[R] && full[L] && full[R])
full[n]=1;
else
full[n]=0;
H[n]=max(H[L],H[R]);
}
void build(int n,int l,int r)
{
if(l>=r) {H[n]=a[l]; full[n]=1; return;}
common;
build(L,l,m);
build(R,m+1,r);
if(H[L]==H[R] && full[L] && full[R]) full[n]=1;
else full[n]=0;
H[n]=max(H[L],H[R]);
}
void cit()
{int op,c,b,i;
ifstream fin("arbint.in");
fin>>N>>T;
for(i=1;i<=N;i++)
{ fin>>a[i];
//cout<<a[i];
}
build(1,1,N);
while(T--)
{
fin>>op;
if(op==0)
{ fin>>c>>b;
fout<<query(1,1,N,c,b)<<"\n";
}
else
{fin>>c>>b;
update(1,1,N,c,c,b);
}
}
fin.close();
}
int main()
{
cit();
fout.close();
return 0;
}