#include <stdio.h>
#include <cstring>
using namespace std;
#define LEFT(x) (2*x+1)
#define RIGHT(x) (2*x+2)
#define max(a,b) (a<b?b:a)
int ai[262143];
void update(int node,int L,int R,int pos,int val)
{
if(L==R&&L==pos)
{
ai[node]=val;
return;
}
int M=L+(R-L)/2;
if(pos<=M) update(LEFT(node),L,M,pos,val);
else update(RIGHT(node),M+1,R,pos,val);
ai[node]=max(ai[LEFT(node)],ai[RIGHT(node)]);
}
int query(int node,int L,int R,int a,int b)
{
if(a<=L&&R<=b) return ai[node];
int M=L+(R-L)/2;
int qL,qR;
qL=qR=0;
if(a<=M) qL=query(LEFT(node),L,M,a,b);
if(b>M) qR=query(RIGHT(node),M+1,R,a,b);
return max(qL,qR);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
memset(ai,0,sizeof(ai));
int N,M;
scanf("%d%d",&N,&M);
--N;
for(int i=0;i<=N;++i)
{
int x;
scanf("%d",&x);
update(0,0,N,i,x);
}
while(M--)
{
int op,a,b;
scanf("%d%d%d",&op,&a,&b);
if(op==0) printf("%d\n",query(0,0,N,a-1,b-1));
else update(0,0,N,a-1,b);
}
return 0;
}