using namespace std;
#include<iostream>
#include<fstream>
#include<cstdlib>
#define oo 0x3f3f3f3f
int H[300005],a[100005],full[300005],N,M;
#define common int m=(l+r)/2, L=2*n, R=L+1
ofstream fout("arbint.out");
void update(int n,int ql,int qr,int l,int r,int v)
{
if(ql<=l && r<=qr)
{
H[n]=v;
full[n]=1;
return;
}
common;
if(full[n]==1)
{
full[n]=0;
full[L]=full[R]=1;
H[L]=H[R]=H[n];
}
if(ql<=m) update(L,ql,qr,l,m,v);
if(qr>=m+1) update(R,ql,qr,m+1,r,v);
if(full[L]==1 && full[R]==1 && H[L]==H[R]) full[n]=1;
else full[n]=0;
H[n]=max(H[L],H[R]);
}
int query(int n,int ql,int qr,int l,int r)
{
int x,sol=-oo;
if(full[n])
return H[n];
if(ql<=l && r<=qr) // daca [l,r] este inclus in [ql,qr]
return H[n];
common;
if(ql<=m)
{
x=query(L,ql,qr,l,m);
sol=sol>x?sol:x;
}
if(qr>=m+1)
{
x=query(R,ql,qr,m+1,r);
sol=sol>x ?sol : x;
}
return sol;
}
inline void build(int n,int l,int r)
{
if(l>=r) {H[n]=a[1]; full[n]=1; return;}
common;
build(L,l,m);
build(R,m+1,r);
if(full[L]==1 && full[R]==1 && H[L]==H[R]) full[L]=1;
else full[R]==1;
H[n]=max(H[L],H[R]);
}
void cit()
{int i,x,xa,xb;
ifstream fin("arbint.in");
fin>>N>>M;
for(i=1;i<=N;i++)
fin>>a[i];
build(1,1,N);
for(i=1;i<=M;i++)
{
fin>>x>>xa>>xb;
if(x==1)
{
update(1,xa,xa,1,N,xb);
}
else
fout<<query(1,xa,xb,1,N)<<"\n";
}
fin.close();
}
int main()
{
cit();
fout.close();
return 0;
}