#include <bits/stdc++.h>
using namespace std;
int arb[400005], A[100005], t, a, b, n, m, i;
void build(int nod, int l, int r)
{
if(l == r)
{
arb[nod] = A[r];
return;
}
int m = (l + r) / 2, fs = 2 * nod;
build(fs, l, m);
build(fs + 1, m + 1, r);
arb[nod] = max(arb[fs], arb[fs + 1]);
}
int query(int nod, int l, int r)
{
if(a > r || b < l)
return 0;
if(l >= a && r <= b)
return arb[nod];
int m = (l + r) / 2, fs = 2 * nod;
return max(query(fs, l, m), query(fs + 1, m + 1, r));
}
void update(int nod, int l, int r)
{
if(l == r)
{
arb[nod] = b;
return;
}
int m = (l + r) / 2, fs = 2 * nod;
if(m >= a)
update(fs, l, m );
else
update(fs + 1, m + 1, r);
arb[nod] = max(arb[fs], arb[fs + 1]);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= n; i++)
scanf("%d", &A[i]);
build(1, 1, n);
for(; m; m--)
{
scanf("%d%d%d", &t, &a, &b);
if(!t)
printf("%d\n", query(1, 1, n));
else
update(1, 1, n);
}
return 0;
}