#include<stdio.h>
#define MAX 100001
int ARB[4*MAX],M,N,POZ,VAL,sfarsit,start,REZULTAT;
int maxim(int x,int y)
{if(x>y) return x; return y;}
void deschidere()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
}
void actualizare(int NOD,int st,int dr)
{
if (st==dr)
{
ARB[NOD]=VAL;
return;
}
int mij = (st+dr)/2;
if(POZ<=mij)
actualizare(NOD*2,st,mij);
else
actualizare(NOD*2+1,mij+1,dr);
ARB[NOD]=maxim(ARB[NOD*2],ARB[NOD*2+1]);
}
void interogare(int NOD,int st,int dr)
{
if(st>=start&&dr<=sfarsit)
{
if(ARB[NOD]>REZULTAT)
REZULTAT=ARB[NOD];
return ;
}
int mij= (st+dr)/2;
if(start<=mij)
interogare(NOD*2,st,mij);
if(sfarsit>mij)
interogare(NOD*2+1,mij+1,dr);
}
void citire()
{
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
{
scanf("%d",&VAL);POZ=i;
actualizare(1,1,N);
}
}
void rezolvare()
{
REZULTAT=0;int operatie;
while(M--)
{
scanf("%d%d%d",&operatie,&start,&sfarsit);
if(operatie==0)
{
interogare(1,1,N);
printf("%d\n",REZULTAT);
REZULTAT=0;
}
else
{
POZ=start,VAL=sfarsit;actualizare(1,1,N);
}
}
}
int main()
{
deschidere();
citire();
rezolvare();
return 0;
}