#include <bits/stdc++.h>
using namespace std;
int n,v[400005],aint[400005];
void update(int st,int dr, int val, int nod, int poz)
{
if(st==dr)
{
aint[nod]=val;
return;
}
if((st+dr)/2<poz)
{
update((st+dr)/2+1,dr,val,nod*2+1,poz);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
else
{
update(st,(st+dr)/2,val,nod*2,poz);
aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
}
int querry(int st_q,int dr_q, int st, int dr, int nod)
{
if(st_q<=st&&dr_q>=dr)
{
return aint[nod];
}
int m=0;
if(st_q<=(st+dr)/2)
{
m=max(m,querry(st_q,dr_q,st,(st+dr)/2,nod*2));
}
if(dr_q>(st+dr)/2)
{
m=max(m,querry(st_q,dr_q,(st+dr)/2+1,dr,nod*2+1));
}
return m;
}
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int m;
cin>>n>>m;
int p=1;
for(int i=1;i<=n;i++)
{
cin>>v[i];
}
while(p<n)
{
p=p*2;
}
n=p;
for(int i=1;i<=n;i++)
{
update(1,n,v[i],1,i);
}
int t,a,b;
for(int i=1;i<=m;i++)
{
cin>>t>>a>>b;
if(t==1)
{
update(1,n,b,1,a);
}
else
{
cout<<querry(a,b,1,n,1)<<"\n";
}
}
return 0;
}