#include<fstream.h>
long max,n,a[262144],alfabet,ind;
long MaxAB(long alfa, long beta)
{
if (alfa>beta)return alfa;
return beta;
}
void Update(long nod, long st, long dr, long poz, long val)
{
if (st==dr)
{
a[nod]=val;
return;
}
int m=(st+dr)/2;
if (poz<=m)Update(2*nod,st,m,poz,val);
else Update(2*nod+1,m+1,dr,poz,val);
a[nod]=MaxAB(a[2*nod],a[2*nod+1]);
}
void Query(long nod, long st, long dr, long start, long finish)
{
if (start<=st && dr<=finish)
{
max=MaxAB(max,a[nod]);
return;
}
long m=(st+dr)/2;
if (start<=m)Query(2*nod,st,m,start,finish);
if (m<finish)Query(2*nod+1,m+1,dr,start,finish);
}
int main()
{
long i,X,pos,type,x,y;
ifstream f("arbint.in");
f>>n>>alfabet;
for (i=1;i<=n;i++)
{
f>>X;
pos=i;
Update(1,1,n,pos,X);
}
ofstream g("arbint.out");
for (ind=1;ind<=alfabet;ind++)
{
f>>type>>x>>y;
if (type==0)
{
max=-1;
Query(1,1,n,x,y);
g<<max<<"\n";
}
else
{
Update(1,1,n,x,y);
}
}
return 0;
}