#include<cstdio>
using namespace std;
int v[100000*4];
int max(int a,int b)
{
if(a<b)
return b;
return a;
}
void update(int val, int poz, int st, int dr, int poz2)
{
int mij;
if(st==dr)
{
v[poz2]=val;
return;
}
mij=(st+dr)/2;
if(poz<=mij)
update(val,poz,st,mij,2*poz2);
else
update(val,poz,mij+1,dr,2*poz2+1);
v[poz2]=max(v[2*poz2],v[2*poz2+1]);
}
int ans;
void query(int nod, int left, int right, int a, int b)
{
if(a<=left&&right<=b)
{
ans=max(ans,v[nod]);
return;
}
int mid=(left+right)/2;
if(a<=mid)
query(nod*2,left,mid,a,b);
if(mid<b)
query(nod*2+1,mid+1,right,a,b);
}
int vec[100001];
void build(int n)
{
int i;
for(i=n;i<=n*2-1;i++)
{
v[i]=vec[i-n+1];
}
int k=n/2;
while(k!=1)
{
for(i=k;i<=k*2-1;i++)
{
v[i]=max(v[i*2],v[i*2+1]);
}
k/=2;
if(k==1)
v[1]=max(v[2],v[3]);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,m,i,j,f=1,t,x,y;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&vec[i]);
for(i=1;i<=31;i++)
{
f*=2;
if(n<f)
{
n=f;
break;
}
}
build(n);
for(i=1;i<=m;i++)
{
scanf("%d%d%d",&t,&x,&y);
if(t==0)
{
ans=0;
query(1,1,n,x,y);
printf("%d\n",ans);
}
if(t==1)
{
update(y,x,1,n,1);
}
}
return 0;
}