#include <cstdio>
#define max(a, b) ((a > b) ? a : b)
using namespace std;
int n, m, c, x, y, i, val,v[100000], arbint[262144], p2 = 1;
void update(int x, int y, int st, int dr, int pos)
{
if(st==dr)
arbint[pos]=y;
else
{
int m=(st+dr)>>1;
if(x<=m)
update(x,y,st,m,(pos<<1));
else
update(x,y,m+1,dr,(pos<<1)+1);
arbint[pos] = max(arbint[pos << 1], arbint[(pos << 1) + 1]);
}
}
int query(int x, int y, int st, int dr, int pos) {
if(x <= st && dr <= y)
return arbint[pos];
else if(x > dr || y < st)
return 0;
else {
int m = (st + dr) / 2;
return max(query(x, y, st, m, 2*pos), query(x, y, m+1, dr, 2*pos+1));
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d%d", &n, &m);
for(p2 = 1; p2 <= n; p2 <<= 2);
for(i = 1; i <= n; ++i)
{
scanf("%d", &y);
update(i, y,1,n,1);
}
for(i = 1; i <= m; ++i)
{
scanf("%d%d%d", &c, &x, &y);
if(c == 0)
printf("%d\n", query(x, y, 1, n, 1));
else
update(x, y,1,n,1);
}
}