#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 100005;
int N, M, Arb[3 * MAXN], pos, val, maxim, start, finish;
void Update(int node, int l, int r)
{
if (l == r)
{
Arb[node] = val;
return;
}
int mid = (l + r) / 2;
if (pos <= mid)
Update(2 * node, l, mid);
else
Update(2 * node + 1, mid + 1, r);
Arb[node] = max(Arb[2 * node], Arb[2 * node + 1]);
}
void Query(int node, int l, int r)
{
if (start <= l && r <= finish)
{
maxim = max(maxim, Arb[node]);
return;
}
int mid = (l + r) / 2;
if (start <= mid)
Query(2 * node, l, mid);
else
Query(2 * node + 1, mid + 1, r);
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (int i = 1, x; i <= N; ++i)
{
scanf("%d", &x);
pos = i;
val = x;
Update(1, 1, N);
}
for (int type, a, b; M; --M)
{
scanf("%d %d %d", &type, &a, &b);
if (type == 1)
{
pos = a;
val = b;
Update(1, 1, N);
}
else
{
start = a;
finish = b;
maxim = -1;
Query(1, 1, N);
printf("%d\n", maxim);
}
}
return 0;
}