#include <cstdio>
using namespace std;
int v[100002], arb[400004];
int a, b;
inline int max(int a, int b)
{
if (a > b)
return a;
return b;
}
int buildTree(int i, int left, int right)
{
if (left == right)
arb[i] = v[left];
else
arb[i] = max(buildTree(2*i, left, (left+right)/2), buildTree(2*i+1, (left+right)/2+1, right));
return arb[i];
}
int query(int i, int left, int right)
{
if (a <= left && right <= b)
return arb[i];
if (right < a || b < left)
return -1;
int mid = (left+right)/2;
return max(query(2*i, left, mid), query(2*i+1, mid+1, right));
}
int update(int i, int left, int right)
{
if (left == right)
{
if (left == a)
arb[i] = b;
return arb[i];
}
if (a < left || right < a)
return arb[i];
int mid = (left+right)/2;
arb[i] = max(update(2*i, left, mid), update(2*i+1, mid+1, right));
return arb[i];
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &v[i]);
buildTree(1, 1, n);
int t;
while (m--)
{
scanf("%d%d%d", &t, &a, &b);
if (t == 0)
printf("%d\n", query(1, 1, n));
else
update(1, 1, n);
}
return 0;
}