#include <cstdio>
using namespace std;
int a[200001],i,n,m,poz,val,x,y,caz;
int maxim(int x, int y){if(x>y) return x;return y;}
void update(int left, int right, int nod)
{
if(left==right){a[nod]=val;return;}
int piv=(left+right)/2;
if(poz<=piv){update(left,piv,nod*2);}
else{update(piv+1,right,nod*2+1);}
a[nod]=maxim(a[2*nod],a[2*nod+1]);
}
int query(int left, int right, int nod)
{
if((x<=left)&&(right<=y)){return a[nod];}
int piv=(left+right)/2;
int q1=0,q2=0;
if(x<=piv){q1=query(left,piv,nod*2);}
if(piv<y){q2=query(piv+1,right,nod*2+1);}
return maxim(q1,q2);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){scanf("%d",&val);poz=i;update(1,n,1);}
while(m--)
{
scanf("%d",&caz);
if(caz==0)
{
scanf("%d%d",&x,&y);
printf("%d\n",query(1,n,1));
}
if(caz==1)
{
scanf("%d%d",&poz,&val);
update(1,n,1);
}
}
return 0;
}