#include <bits/stdc++.h>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int const lmax=100007*4;
int const minf=0x3f3f3f3f*(-1);
int v[lmax],n,q;
int a,b,c;
void update(int st, int dr, int nod, int val, int pos)
{
//cout<<st<<" "<<dr<<" "<<nod<<"\n";
if(st==dr)
{
v[nod]=val;
return;
}
int mij=(st+dr)/2;
if(pos<=mij)
{
update(st,mij,nod*2,val,pos);
v[nod]=max(v[2*nod],v[2*nod+1]);
//return ;
}
else
{
update(mij+1,dr,nod*2+1,val,pos);
v[nod]=max(v[2*nod],v[2*nod+1]);
//return ;
}
}
int querry(int st, int dr,int nod, int st_i, int dr_i)///st_i=st interval
{
if(st>=st_i and dr<=dr_i)
{
return v[nod];
}
int mij=(st+dr)/2;
int val=minf;
if(st_i<=mij)
{
val=max(val,querry(st,mij,nod*2,st_i,dr_i));
}
if(dr_i>mij)
{
val=max(val,querry(mij+1,dr,nod*2+1,st_i,dr_i));
}
return val;
}
int main()
{
fin>>n>>q;
for(int i=0;i<lmax;i++)
{
v[i]=minf;
}
for(int i=0;i<n;i++)
{
int x;
fin>>x;
update(0,n-1,1,x,i);
}
for(int i=0;i<q;i++)
{
fin>>a>>b>>c;
if(a==0)
{
b--;c--;
fout<<querry(0,n-1,1,b,c)<<"\n";
}
if(a==1)
{
b--;
update(0,n-1,1,c,b);
}
}
fin.close();
fout.close();
return 0;
}