#include <iostream>
#include <cstdio>
using namespace std;
int arbore[300000];
int N,M;
void update(int nod_curent,int nod,int val,int st,int dr)
{
if(st==dr)
{
arbore[nod_curent]=val;
return;
}
int mid = (st+dr)/2;
if(nod<=mid)
{
update(nod_curent*2,nod,val,st,mid);
}
if(nod>mid)
{
update(nod_curent*2+1,nod,val,mid+1,dr);
}
arbore[nod_curent] = max(arbore[nod_curent*2],arbore[nod_curent*2+1]);
}
void query(int a,int b,int nod_curent,int st,int dr,int &maxim)
{
if(a<=st&&dr<=b)
{
if(arbore[nod_curent]>maxim)
maxim = arbore[nod_curent];
return;
}
int mid = (st+dr)/2;
if(a<=mid)
{
query(a,b,nod_curent*2,st,mid,maxim);
}
if(b>mid)
{
query(a,b,nod_curent*2+1,mid+1,dr,maxim);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
{
int x;
scanf("%d",&x);
update(1,i,x,1,N);
}
for(int i=1;i<=M;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(x == 0)
{
int maxim = 0;
query(y,z,1,1,N,maxim);
printf("%d\n",maxim);
}
else
{
update(1,y,z,1,N);
}
}
return 0;
}