#include <iostream>
#include <cstdio>
#include <algorithm>
FILE *f,*g;
using namespace std;
int N,M,Arb[400000],start,finish,Val,Pos,maxim;
void Update(int nod, int left, int right)
{
if ( left == right )
{
Arb[nod] = Val;
return;
}
int mid = (left+right)/2;
if ( Pos <= mid )
{
Update(2*nod,left,mid);
}
else
{
Update(2*nod+1,mid+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 ( maxim < Arb[nod] )
{
maxim = Arb[nod];
}
return;
}
int mid = (left+right)/2;
if ( start <= mid )
{
Query(2*nod,left,mid);
}
if ( mid < finish )
{
Query(2*nod+1,mid+1,right);
}
}
int main()
{
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
int x,a,b,i;
fscanf(f,"%d %d",&N,&M);
for(i=1 ; i<=N ; i++)
{
fscanf(f,"%d",&x);
Pos = i;
Val = x;
Update(1,1,N);
}
for(i=1 ; i<=M ; i++)
{
fscanf(f,"%d %d %d", &x, &a, &b);
if ( x == 0 )
{
maxim = -1;
start = a;
finish = b;
Query(1,1,N);
fprintf(g,"%d\n",maxim);
}
else
{
Pos = a;
Val = b;
Update(1,1,N);
}
}
fclose(f);
fclose(g);
return 0;
}