#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[400005];
int n,m;
int a[100005];
int Leftson(int x)
{
return 2*x;
}
int Rightson(int x)
{
return 2*x+1;
}
void Build(int nod,int left,int right)
{
if(left==right)
{
aint[nod]=a[left];
return;
}
int mij=(left+right)/2;
Build(Leftson(nod),left,mij);
Build(Rightson(nod),mij+1,right);
aint[nod]=max(aint[Leftson(nod)],aint[Rightson(nod)]);
}
void Update(int nod,int left,int right,int poz,int val)
{
if(left==right)
{
aint[nod]=val;
a[nod]=val;
return;
}
int mij=(left+right)/2;
if(poz<=mij) Update(Leftson(nod),left,mij,poz,val);
else Update(Rightson(nod),mij+1,right,poz,val);
aint[nod]=max(aint[Leftson(nod)],aint[Rightson(nod)]);
}
void Query(int nod,int left,int right,int lquery,int rquery,int &ans)
{
if(left>=lquery && rquery>=right)
{
ans=max(ans,aint[nod]);
return;
}
int mij=(left+right)/2;
if(lquery<=mij) Query(Leftson(nod),left,mij,lquery,rquery,ans);
if(rquery>mij) Query(Rightson(nod),mij+1,right,lquery,rquery,ans);
}
int main()
{
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>a[i];
Build(1,1,n);
for(int i=1;i<=n;i++)
{
int op,a,b;
fin>>op>>a>>b;
if(op==0)
{
int ans=-1;
Query(1,1,n,a,b,ans);
fout<<ans<<"\n";
}
else Update(1,1,n,a,b);
}
return 0;
}