#include <bits/stdc++.h>
#define Dim 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,op,a,b,Tree[4*Dim+2],V[Dim];
void Init(int nod,int st,int dr,int V[]) // initializeaza maximul pe intervalus [st,dr]
{
if(st==dr) Tree[nod]=V[st];
else
{
int mij=(st+dr)>>1;
Init( (1<<nod) ,st,mij,V );
Init( (1<<nod) + 1 ,mij+1,dr,V );
Tree[nod]=max(Tree[(1<<nod)],Tree[(1<<nod)+1]);
}
}
void Update(int nod,int st,int dr)
{
if( st==dr ) Tree[nod]=b;
else
{
int mij=(st+dr)>>1;
if( a<=mij )
Update( 1<<nod , st,mij );
else
Update( (1<<nod) + 1 ,mij+1,dr );
Tree[nod]=max(Tree[ 1<<nod ],Tree[ (1<<nod) + 1 ]);
}
}
void Query(int nod,int st,int dr,int &maxim) // returneza maximiul din intervalul [st,dr] inclus in [a,b]
{
if( st>=a && dr<=b ) maxim=max(maxim,Tree[nod]);
else
{
int mij=(st+dr)>>1;
if( a<=mij ) Query( 1<<nod ,st,mij,maxim);
if( b > mij ) Query( (1<<nod)+1,mij+1,dr,maxim );
}
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;i++) f>>V[i];
Init(1,1,N,V);
// for(int i=1;i<=4*N+1;i++) cout<<Tree[i]<<" "<<i<<'\n';
for(int i=1;i<=M;i++)
{
f>>op>>a>>b;
if(!op)
{
int maxim=0;
Query(1,1,N,maxim);
g<<maxim<<'\n';
}
else
Update(1,1,N);
}
return 0;
}