#include <bits/stdc++.h>
#define father(x) ((x) >> 1)
#define left_son(x) ((x) << 1)
#define right_son(x) (((x) << 1) + 1)
using namespace std;
int max_Aib[400005];
bool op;
int n, m, maxi;
void update (int left, int right, int val, int nod, int fin)
{
if (left == right)
{
max_Aib[nod] = val;
return;
}
int mij = (left + right) >> 1;
if (fin <= mij) update(left, mij, val, left_son(nod), fin);
else update(mij + 1, right, val, right_son(nod), fin);
max_Aib[nod] = max(max_Aib[left_son(nod)], max_Aib[right_son(nod)]);
}
void query(int left, int right, int start, int finish, int nod)
{
if (left >= start && right <= finish)
{
maxi = max(maxi, max_Aib[nod]);
return;
}
int mij = (left + right) >> 1;
if (mij >= start) query(left, mij, start, finish, left_son(nod));
if (mij < finish) query(mij + 1, right, start, finish, right_son(nod));
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1, x, poz; i <= n; i++)
{
scanf("%d", &x);
poz = i;
update(1, n, x, 1, poz);
}
for (int i = 1, a, b; i <= m; i++)
{
scanf("%d %d %d", &op, &a, &b);
if (!op)
{
maxi = -1;
query(1, n, a, b, 1);
printf("%d\n", maxi);
}
else
{
update(1, n, b, 1, a);
}
}
return 0;
}