#include <cstdio>
#define max(a, b) ((a > b) ? a : b)
using namespace std;
int n, m, c, x, y, i, val,maxx,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]);
}
}
void query(int x, int y, int st, int dr, int pos)
{
if(x <= st && dr <= y)
maxx=max(maxx,arbint[pos]);
else
{
int m = (st + dr)>>1;
if(x<=m)
query(x, y, st, m, 2*pos);
if(m<y)
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)
{
maxx=-1;
query(x, y, 1, n, 1);
printf("%d\n", maxx);
}
else
update(x, y,1,n,1);
}
}