#include <stdio.h>
#define nmax 100005
#define arbmax 400005
#define max(i,j) ((i) > (j) ? (i) : (j))
int n, m, t, n1, n2;
int a[nmax], arb[nmax];
void init(int nod, int first, int last)
{
if(first == last) arb[nod] = a[first];
else
{
int middle = (first + last) / 2;
init(nod * 2, first, middle);
init(nod * 2 + 1, middle + 1, last);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
}
void update(int nod, int first, int last, int p)
{
if(first == last) arb[nod] = a[first];
else
{
int middle = (first + last) / 2;
if(p <= middle) update(nod * 2, first, middle, p);
else update(nod * 2 + 1, middle + 1, last, p);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
}
int query(int nod, int first, int last, int a, int b)
{
if(a <= first && last <= b) return arb[nod];
else
{
int middle = (first + last) / 2;
int rez = 0;
if(a <= middle) rez = max(rez, query(nod * 2, first, middle, a, b));
if(b > middle) rez = max(rez, query(nod * 2 + 1, middle + 1, last, a, b));
return rez;
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++) scanf("%d", &a[i]);
init(1, 1, n);
for(int i = 1; i <= m; i++)
{
scanf("%d%d%d", &t, &n1, &n2);
if(t == 0) printf("%d\n", query(1, 1, n, n1, n2));
else
{
a[n1] = n2;
update(1, 1, n, n1);
}
}
return 0;
}