#include <stdio.h>
using namespace std;
int v[400001],n,m,i,c,d,e;
int maxim(int x,int y)
{
if (x>y)
return x;
else
return y;
}
int intr(int nod,int a,int b)
{
int mid,max1,max2,db;
if (d<=a && b<=e)
return v[nod];
else
{
db=nod*2;
mid=a+(b-a)/2;
max1=0;max2=0;
if (d<=mid)
max1=intr(db,a,mid);
if (e>mid)
max2=intr(db+1,mid+1,b);
return maxim(max1,max2);
}
}
void update(int nod,int a,int b)
{
int mid,db;
if (a==b)
v[nod]=e;
else
{
mid=a+(b-a)/2;
db=nod*2;
if (d<=mid)
update(db,a,mid);
else
update(db+1,mid+1,b);
v[nod]=maxim(v[db],v[db+1]);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for (d=1;d<=n;++d)
{
scanf("%d",&e);
update(1,1,n);
}
++m;
while (--m)
{
scanf("%d %d %d",&c,&d,&e);
if (c==0)
printf("%d\n",intr(1,1,n));
else
update(1,1,n);
}
return 0;
}