#include <cstdio>
const int maxn = 100001;
const int maxi = 1 << 18;
FILE *in = fopen("arbint.in","r"), *out = fopen("arbint.out","w");
int n, m;
int a[maxn];
int d[maxi];
void read()
{
fscanf(in, "%d %d", &n, &m);
for ( int i = 1; i <= n; ++i )
fscanf(in, "%d", &a[i]);
}
inline int max(int x, int y)
{
return x > y ? x : y;
}
void build(int nod, int st, int dr)
{
if ( st == dr )
{
d[nod] = a[st];
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
build(q, st, m);
build(q+1, m+1, dr);
d[nod] = max(d[q], d[q+1]);
}
int answ, p, q;
void query(int nod, int st, int dr)
{
if ( q < st || p > dr )
return;
if ( p <= st && dr <= q )
{
answ = max(answ, d[nod]);
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
query(q, st, m);
query(q+1, m+1, dr);
}
int what, becomes;
void update(int nod, int st, int dr)
{
if ( what < st || what > dr )
return;
if ( st == dr )
{
if ( st == what )
d[nod] = what;
return;
}
int q = nod << 1;
int m = (st + dr) >> 1;
update(q, st, m);
update(q+1, m+1, dr);
d[nod] = max(d[q], d[q+1]);
}
int main()
{
read();
build(1, 1, n);
int x, y, z;
for ( int i = 1; i <= m; ++i )
{
fscanf(in, "%d %d %d", &x, &y, &z);
if ( !x )
{
answ = -4;
p = y, q = z;
query(1, 1, n);
fprintf(out, "%d\n", answ);
}
else
{
what = y;
becomes = z;
update(1, 1, n);
}
}
return 0;
}