#include <cstdio>
#include <algorithm>
#define N 100001
using namespace std;
int n,m,start,finish,arb[4*N+50],poz,val,nmax,x,a,b,q;
void Query (int nod,int L,int R)
{
if (start <=L && finish>=R)
{
if (arb[nod]>nmax) nmax=arb[nod];
return;
}
int M=(L+R)/2;
if (start<=M) Query(2*nod, L, M);
if (finish>M) Query(2*nod+1, M+1, R);
}
void Update(int nod, int L, int R)
{
if (L==R)
{
arb[nod]=val;
return;
}
int M=(L+R)/2;
if (poz<=M) Update(2*nod,L,M);
else Update(2*nod+1,M+1,R);
arb[nod]=max(arb[2*nod],arb[2*nod+1]);
}
int main()
{
freopen ("arbint.in", "r", stdin);
freopen ("arbint.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 (;m;m--)
{
scanf("%d%d%d", &q, &a, &b);
if (q)
{
poz=a;
val=b;
Update (1,1,n);
}
else
{
nmax=-1;
start=a; finish=b;
Query(1,1,n);
printf ("%d\n", nmax);
}
}
}