#include <cstdio>
#include <cassert>
#include <algorithm>
#define Nmax 100005
#define InFile "arbint.in"
#define OutFile "arbint.out"
using namespace std;
int n, m, Mx, val, pos, sr, fsh;
int Max[4*Nmax+66];
void read();
void update (int,int,int);
void query (int,int,int);
int main()
{
int i, op, a, b;
assert (freopen (InFile, "r", stdin));
assert (freopen (OutFile, "w", stdout));
read();
for (i=1; i<=m; i++)
{
scanf ("%d %d %d\n", &op, &a, &b);
if (op==0)
{
Mx=-1;
sr=a; fsh=b;
query (1, 1, n);
printf ("%d\n", Mx);
}
else
{
pos=a; val=b;
update (1, 1, n);
}
}
return 0;
}
void read()
{
int i, x;
scanf ("%d %d\n", &n, &m);
for (i=1; i<=n; i++)
{
scanf ("%d ", &x);
pos=i; val=x;
update (1, 1, n);
}
}
void update (int nod, int st, int dr)
{
if (st==dr){
Max[nod]=val;
return;
}
int mij=st+(dr-st)/2;
if (pos<=mij) update (2*nod, st, mij);
else update (2*nod+1, mij+1, dr);
Max[nod]=max (Max[2*nod], Max[2*nod+1]);
}
void query (int nod, int st, int dr)
{
if (sr<=st && dr<=fsh)
{
if (Max[nod]>Mx)
Mx=Max[nod];
return;
}
int mij=st+(dr-st)/2;
if (sr<=mij) query (2*nod, st, mij);
if (mij<fsh) query (2*nod+1, mij+1, dr);
}