#include <stdio.h>
#define maxim(a, b) ((a > b) ? a : b)
int N, M;
int A[262144];
void update(int nod, int left, int right, int poz, int val)
{
if (left == right)
A[nod] = val;
else
{
int m = (left + right) / 2;
if (poz <= m)
update(2*nod,left,m,poz,val);
else
update(2*nod+1,m+1,right,poz,val);
A[nod] = maxim(A[2*nod], A[2*nod+1]);
}
}
int query(int nod, int left, int right, int a, int b)
{
if (a <= left && right <= b)
return A[nod];
int m = (left+right)/2;
int i1 = 0, i2 = 0;
if (a <= m)
i1 = query(2*nod, left, m, a, b);
if (b > m)
i2 = query(2*nod+1, m+1, right, a, b);
return maxim(i1, i2);
}
int main()
{
int i, x, y, tip;
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &N, &M);
for (i = 1; i <= N; ++i)
{
scanf("%d", &x);
update(1, 1, N, i, x);
}
while (M--)
{
scanf("%d %d %d", &tip, &x, &y);
if (tip == 0)
printf("%d\n", query(1, 1, N, x, y));
else
update(1, 1, N, x, y);
}
return 0;
}