#include<cstdio>
#include<algorithm>
using namespace std;
const char in[]="arbint.in";
const char out[]="arbint.out";
const int Max_N = 100005;
int arb[Max_N * 2], a, b, op, poz, maxim, val, N, M, x, y;
void update(int nod, int lo, int hi)
{
if(lo == hi)
{
arb[nod] = val;
return;
}
int mid = lo + ( hi - lo) /2;
if( poz <= mid ) update(2 * nod, lo, mid);
else update( 2 * nod + 1 , mid + 1, hi);
arb[nod] = max(arb[2 * nod], arb[ 2 * nod + 1]);
}
void querry(int nod, int lo, int hi)
{
if(a <= lo && hi <= b)
{
maxim = max( maxim, arb[nod]);
return;
}
int mid = lo + (hi - lo) /2;
if(mid < b)querry(2 * nod + 1, mid + 1, hi);
if(a <= mid) querry(2 * nod, lo, mid);
}
int main()
{
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%d %d", &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", &op, &x, &y);
if(!op)
{
a = x, b = y;
maxim = -1;
querry(1, 1, N);
printf("%d\n", maxim);
}
else
{
poz = x, val = y;
update(1, 1, N);
}
}
return 0;
}