#include <bits/stdc++.h>
#define left_son(x) (x << 1)
#define right_son(x) ((x << 1) + 1)
using namespace std;
const int N = 100005;
int aint[N * 4];
int n, m, start, finish, rez;
int op;
void update(int nod, int left, int right, int poz, int x)
{
if (left == right)
{
aint[nod] = x;
return;
}
int mid = (left + right) >> 1;
if (poz <= mid) update(left_son(nod), left, mid, poz, x);
else update(right_son(nod), mid + 1, right, poz, x);
aint[nod] = max(aint[left_son(nod)], aint[right_son(nod)]);
}
void querry(int nod, int left, int right)
{
if (left >= start && right <= finish)
{
rez = max(rez, aint[nod]);
return;
}
int mid = (left + right) >> 1;
if (start <= mid) querry(left_son(nod), left, mid);
else if (finish > mid) querry(right_son(nod), mid + 1, right);
}
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),
update(1, 1, n, i, x);
for (int i = 1; i <= m; i++)
{
scanf("%d %d %d", &op, &start, &finish);
if (!op)
{
rez = -1;
querry(1, 1, n);
printf("%d\n", rez);
continue;
}
else update(1, 1, n, start, finish);
}
}