#include<cstdio>
#define LEN 131072
int t[LEN];
int n;
int f (int x, int y)
{
return x>y?x:y;
}
void _update (int n, int s, int e, int x, int val)
{
if(s==e){
t[n]=val;
return;
}
int m=(s+e)/2;
//2*n covers s — m
//2*n+2 covers m+1 — e
if(x<=m)//go left
_update (2*n+1, s, m, x, val);
else
_update (2*n+2, m+1, e, x, val);
t[n]=f (t[2*n+1],t[2*n+2]);
}
void update (int x, int val)
{
_update (0, 0, n-1, x, val);
}
int _query (int n, int s, int e, int x, int y)
{
if(s==e)
return t[n];
int m=(s+e)/2;
if(x<=m&&y>m)//x — y cuts both intervals -> go both ways
return f (
_query (2*n+1, s, m, x, m),
_query (2*n+2, m+1, e, m+1, y)
);
if(y<=m)//x — y cuts only left interval -> go left
return _query (2*n+1, s, m, x, m);
if(x>m)//x — y cuts only right interval -> go right
return _query (2*n+2, m+1, e, m+1, y);
return -424242;
}
int query (int x,int y)
{
return _query (0, 0, n-1, x, y);
}
int main()
{
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
int m;
scanf ("%d%d",&n,&m);
for(int i=0;i<n;i++){
int x;
scanf ("%d",&x);
update (i,x);
}
while(m--){
int o,a,b;
scanf ("%d%d%d",&o,&a,&b);
if(o)
update (a-1,b);
else
printf ("%d\n", query (a-1,b-1));
}
return 0;
}