#include <fstream>
#include <algorithm>
#define Nmax 100099
#define T(i) i/2
#define LS(i) (2*i)
#define RS(i) (2*i+1)
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N,M,v[Nmax],Arb[4*Nmax],poz,val,a,b,sol;
void Update(const int &nod,const int &left,const int &right)
{
if(left==right)
{
Arb[nod]=val;
return;
}
int middle=(left+right)>>1;
if(poz<=middle)Update(LS(nod),left,middle);
else Update(RS(nod),middle+1,right);
Arb[nod]=max(Arb[LS(nod)],Arb[RS(nod)]);
}
void Querry(const int &nod,const int &left,const int &right)
{
if(a<=left && right<=b)
{
if(sol<Arb[nod])sol=Arb[nod];
return;
}
int middle=(left+right)>>1;
if(a<=middle)Querry(LS(nod),left,middle);
if(middle<b )Querry(RS(nod),middle+1,right);
}
int main()
{
f>>N>>M;
for(int i=1;i<=N;++i)
{
f>>v[i];
poz=i,val=v[i];
Update(1,1,N);
}
for(int i=1;i<=M;++i)
{
int op;
f>>op>>a>>b;
if(!op)
{
sol=-1;
Querry(1,1,N);
g<<sol<<'\n';
}
else
{
poz=a,val=b;
Update(1,1,N);
}
}
f.close();g.close();
return 0;
}