#include<stdio.h>
int n,m,a[610000],i,max;
int maxim(int x,int y)
{ if(x>y) return x;
else return y;
}
void update(int nod,int left,int right,int poz,int val)
{if(left==right)
a[nod]=val;
else { int mij=(left+right)/2;
if(poz<=mij)
update(2*nod,left,mij,poz,val);
if(poz>mij)
update(2*nod+1,mij+1,right,poz,val);
a[nod]=maxim(a[2*nod],a[2*nod+1]);
}
}
void query(int nod,int left,int right,int l,int r)
{ if(left>=l&&r>=right)
{if(max<a[nod])
max=a[nod];
}
else
{ int mij=(left+right)/2;
if(mij>=l)
query(2*nod,left,mij,l,r);
if(mij<r)
query(2*nod+1,mij+1,right,l,r);
}
}
int main()
{ freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{ int t;
scanf("%d",&t);
update(1,1,n,i,t);
}
for(i=1;i<=m;i++)
{ max=0;
int q,w,e;
scanf("%d%d%d",&q,&w,&e);
if(q==0)
{ query(1,1,n,w,e);
printf("%d\n",max);
}
if(q==1)
update(1,1,n,w,e);
}
return 0;}