#include <stdio.h>
#include <algorithm>
using namespace std;
#define maxn 100005
int arb[4*maxn+5];
int n, m, st, dr, pos, mx, val;
void update(int nod, int l, int r)
{
if (l!=r)
{
int mij = (l+r)/2;
if (pos <= mij)
update(2*nod,l,mij);
else
update(2*nod+1,mij+1,r);
arb[nod] = max(arb[2*nod], arb[2*nod+1] );
}
else
{
arb[nod] = val;
}
}
void query(int nod, int l, int r)
{
if(st<=l && dr>=r)
{
if(mx<arb[nod])
{
mx=arb[nod];
return;
}
}
int mij = (l+r/2);
if(st<=mij)
query(2*nod, st, mij);
if(dr>mij)
query(2*nod+1, mij+1, dr);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
int x;
for(int i=1;i<=n;i++)
{
scanf("%d", &x);
pos = i;
val = x;
update(1, 1, n);
}
int a, b;
for(int i=1;i<=m;i++)
{
scanf("%d%d%d", &x, &a, &b);
if(!x)
{
mx=-1;
st = a;
dr = b;
query(1, 1, n);
printf("%d\n", mx);
}
else
{
pos = a;
val = b;
update(1, 1, n);
}
}
return 0;
}