#include <stdio.h>
#define NMAX 400005
using namespace std;
int ARB[NMAX],N,M,X,A,B;
int start,finish,val,poz,MAX;
int max(int a,int b)
{
if (a>b) return a;
return b;
}
void update(int nod,int left,int right)
{
if (left==right)
{
ARB[nod]=val;
return;
}
int div=(left+right)/2;
if (poz<=div)
update(2*nod,left,div);
else
update(2*nod+1,div+1,right);
ARB[nod]=max(ARB[2*nod],ARB[2*nod+1]);
}
void query(int nod,int left,int right)
{
if (start<=left && right<=finish)
{
if (MAX<ARB[nod]) MAX=ARB[nod];
return ;
}
int div=(left+right)/2;
if (start<=div)
query(2*nod,left,div);
if (div<finish)
query(2*nod+1,div+1,right);
}
int main()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
scanf("%d %d\n",&N,&M);
for (int i=1;i<=N;i++)
{
scanf("%d ",&X);
poz=i;
val=X;
update(1,1,N);
}
for (int i=1;i<=M;i++)
{
scanf("%d %d %d\n",&X,&A,&B);
if (!X)
{
MAX=-1;
start=A;
finish=B;
query(1,1,N);
printf("%d\n",MAX);
}
else
{
poz=A;
val=B;
update(1,1,N);
}
}
fclose(stdin);
fclose(stdout);
return 0;
}