#include <cstdio>
#include <algorithm>
using namespace std;
const int Nmax=100005;
int v[4*Nmax],place[Nmax],maxx;
void dfs(int pos,int st,int dr)
{
if(st==dr)
{
place[st]=pos;
return;
}
dfs(2*pos,st,(st+dr)/2);
dfs(2*pos+1,(st+dr)/2+1,dr);
}
void up(int pos)
{
if(pos==0) return;
v[pos]=max(v[2*pos],v[2*pos+1]) ;
up(pos/2);
}
void query(int pos,int st,int dr,int a,int b)
{
if(st>=a and dr<=b)
{
if(v[pos]>maxx) maxx=v[pos];
return;
}
if(dr<a) return;
if(st>b) return;
query(2*pos,st,(st+dr)/2,a,b);
query(2*pos+1,(st+dr)/2+1,dr,a,b);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m,i,j,x,p,a,b;
scanf("%d%d",&n,&m);
dfs(1,1,n);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
v[place[i]]=x;
up(place[i]/2);
}
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&p,&a,&b);
if(p==0)
{
maxx=0;
query(1,1,n,a,b);
printf("%d\n",maxx);
}
else
{
v[place[a]]=b;
up(place[a]/2);
}
}
return 0;
}