#include <stdio.h>
#define Inf 0x3f3f3f3f
#define Nmax 200100
#define Fin "arbint.in"
#define Fout "arbint.out"
int arbore[Nmax];
int a,b,n,m;
int i,x,maxim;
inline int max(int a, int b) { return a>b?a:b; }
void interogare(int nod, int st, int dr, int a, int b)
{
int mij;
if (st==dr)
{
arbore[nod]=b;
return ;
}
mij=(st+dr)>>1;
if (a<=mij)
{
interogare(2*nod,st,mij,a,b);
}
else
{
interogare(2*nod+1,mij+1,dr,a,b);
}
arbore[nod]=max(arbore[2*nod],arbore[2*nod+1]);
}
void actualizare(int nod, int st, int dr, int a, int b)
{
int mij;
if (a<=st && dr<=b)
{
maxim=max(maxim,arbore[nod]);
return ;
}
mij=(st+dr)>>1;
if (a<=mij)
{
actualizare(2*nod,st,mij,a,b);
}
else
{
actualizare(2*nod+1,mij+1,dr,a,b);
}
}
int main()
{
freopen(Fin,"r",stdin);
freopen(Fout,"w",stdout);
scanf("%d %d",&n,&m);
for (i=1;i<=n;++i)
{
scanf("%d", &x);
interogare(1,1,n,i,x);
}
while(m--)
{
scanf("%d %d %d", &x,&a,&b);
if (x==0)
{
maxim=-Inf;
actualizare(1,1,n,a,b);
printf("%d\n", maxim);
}
else
{
interogare(1,1,n,a,b);
}
}
return 0;
}