#include<cstdio>
#define nmax 100010
int n, m;
int v[5*nmax];
inline int max(int a, int b)
{
if(a<b)
return b;
return a;
}
void update(int x, int l, int r, int c, int val)
{
if(l==r)
{
v[x] = val;
return;
}
int mid = (l+r)/2;
if(c <= mid)
update(2*x, l, mid, c, val);
else
update(2*x+1, mid+1, r, c, val);
v[x] = max(v[2*x], v[2*x+1]);
}
int query(int x, int l, int r, int a, int b)
{
if (a<=l && r<=b)
return v[x];
int mx=0, mid=(l+r)/2;
if(a<=mid)
mx = query(x*2, l, mid, a, b);
if(mid<b)
mx = max(mx, query(x*2+1, mid+1, r, a, b));
return mx;
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
scanf("%d %d", &n, &m);
int i, x, a, b;
for(i=1; i<=n; i++)
{
scanf("%d", &x);
update(1, 1, n, i, x);
}
for(i=1; i<=m; i++)
{
scanf("%d %d %d", &x, &a, &b);
if(x==0)
printf("%d\n", query(1, 1, n, a, b) );
else
update(1, 1, n, a, b);
}
return 0;
}