#include <cstdio>
#include <fstream>
using namespace std;
int maxim=0;
int v[100001],aint[200001];
int max(int a,int b)
{
if(a>b)
return a;
else
return b;
}
void update(int nod,int st,int dr,int poz,int x)
{
if(st==dr)
{
aint[nod]=x;
v[poz]=x;
return;
}
int mij=(st+dr)/2;
if(poz<=mij)
update(nod*2,st,mij,poz,x);
else
update(nod*2+1,mij+1,dr,poz,x);
aint[nod]=max(aint[nod*2],aint[nod*2+1]);
}
void query(int nod,int st,int dr,int A,int B)
{
if(A<=st&&dr<=B)
{
maxim=max(maxim,aint[nod]);
return ;
}
int mij=(st+dr)/2;
if(mij>=A)
query(nod*2,st,mij,A,B);
if(mij+1<=B)
query(nod*2+1,mij+1,dr,A,B);
}
void Build(int nod,int st,int dr)
{
if(st==dr)
{
aint[nod]=v[st];
return;
}
int mij=(st+dr)/2;
Build(nod*2,st,mij);
Build(nod*2+1,mij+1,dr);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int main()
{
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m,i,ok,a,b;
fin>>n>>m;
for(i=1; i<=n; i++)
fin>>v[i];
Build(1,1,n);
for(i=1; i<=m; i++)
{
fin>>ok>>a>>b;
//fout<<ok<<" "<<a<<" "<<b<<"\n";
if(ok)
{
update(1,1,n,a,b);
}
else
{
maxim=-1;
query(1,1,n,a,b);
fout<<maxim<<"\n";
}
}
return 0;
}