#include <fstream>
#define NMAX 100100
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
//cu leizi
int N,aint[4*NMAX], lz[4*NMAX];
void propag(int nod)
{
if(lz[nod])
{
lz[2*nod]=lz[2*nod+1]=lz[nod];
aint[2*nod]=aint[2*nod+1]=lz[nod];
lz[nod]=0;
}
}
void update(int nod, int st, int dr, int L, int R, int val)
{
if(L<=st && dr<=R)
{
aint[nod]=val;
lz[nod]=val;
return ;
}
propag(nod);
int mid=(st+dr)/2;
if(L<=mid) update(2*nod, st, mid, L,R,val);
if(mid<R) update(2*nod+1,mid+1, dr, L,R,val);
aint[nod]=max(aint[nod*2],aint[2*nod+1]);
}
int query(int nod, int st, int dr, int L, int R)
{
if(L>dr || R<st)
return 0;
if(L<=st && dr<=R)
return aint[nod];
int mid=(st+dr)/2, ans=0;
if(st<=mid) ans=max(ans, query(nod*2, st,mid, L,R));
if(mid<dr) ans=max(ans, query(nod*2+1, mid+1, dr, L,R));
return ans;
}
int main()
{
int M,st,dr, op, val;
cin>>N>>M;
for(int i=1; i<=N; ++i)
{
cin>>val;
update(1,1,N,i,i,val);
}
while(M--)
{
cin>>op>>st>>dr;
if(op==1)
update(1,1,N,st,st,dr);
else
cout<<query(1,1,N,st,dr)<<'\n';
}
return 0;
}