#include <stdio.h>
#define dim 100100
int n, m, pos, val, start, end, maxim, arb[2*dim];
inline int max(const int a, const int b)
{
return a>b?a:b;
}
void update(int, int, int);
void query(int, int, int);
int main()
{
int i, op, x, y;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d\n", &n, &m);
for (i=1; i<=n; i++)
{
scanf("%d ", &x);
pos=i, val=x;
update(1, 1, n);
}
for (i=1; i<=m; i++)
{
scanf("%d %d %d\n", &op, &x, &y);
if (!op)
{
maxim=-1;
start=x, end=y;
query(1, 1, n);
printf("%d\n", maxim);
continue;
}
pos=x, val=y;
update(1, 1, n);
}
return 0;
}
void update(int nod, int l, int r)
{
int div;
if (l==r)
{
arb[nod]=val;
return;
}
div=l+(r-l)/2;
if (pos<=div) update(2*nod, l, div);
else update(2*nod+1, div+1, r);
arb[nod]=max(arb[2*nod], arb[2*nod+1]);
}
void query(int nod, int l, int r)
{
int div;
if (start<=l && r<=end)
{
if (maxim<arb[nod]) maxim=arb[nod];
return;
}
div=l+(r-l)/2;
if (start<=div) query(2*nod, l, div);
if (div<end) query(2*nod+1, div+1, r);
}