#include <cstdio>
#define nm 100010
long T[4*nm];
long A[nm];
long mx;
long n, m;
inline long max(long a, long b)
{
return a>b?a:b;
}
void update(long n, long e, long u, long p, long v)
{
if (e==u) A[e]=T[n]=v;
else
{
long mid=(e+u)>>1;
if (p<=mid) update(2*n, e, mid, p, v);
else update(2*n+1, mid+1, u, p, v);
if (T[2*n]>T[2*n+1])
T[n]=T[2*n];
else
T[n]=T[2*n+1];
}
}
void query(long n, long e, long u, long i, long j)
{
if (i<=e && u<=j) mx=max(mx,T[n]);
else
{
long mid=(e+u)>>1;
if (i<=mid) query(2*n, e, mid, i, j);
if (j>mid) query(2*n+1, mid+1, u, i, j);
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%ld%ld", &n, &m);
for (long i=1; i<=n; ++i) scanf("%ld", A+i), update(1,1,n,i,A[i]);
for (long i=1; i<=m; ++i)
{
int x;long i1, i2;scanf("%d%ld%ld", &x, &i1, &i2);
if (x==0)
{
mx=0;
query(1,1,n,i1,i2);
printf("%ld\n", mx);
}
else update(1,1,n,i1,i2);
}
return 0;
}