#include<cstdio>
#include<algorithm>
using namespace std;
int N,M,i,Rez,X,Y,val,poz,A[100005],Arb[(1<<18)+5];
void Build(int Node,int L,int R)
{
if(L==R) {Arb[Node]=A[L]; return;}
int M=(L+R)/2;
int LS=2*Node;
int RS=LS+1;
Build(LS,L,M);
Build(RS,M+1,R);
Arb[Node]=max(Arb[LS],Arb[RS]);
}
void Update(int Node,int L,int R)
{
if(L==R) {Arb[Node]=val; return;}
int M=(L+R)/2;
int LS=2*Node;
int RS=LS+1;
if(poz<=M) Update(LS,L,M);
else Update(RS,M+1,R);
Arb[Node]=max(Arb[LS],Arb[RS]);
}
void Query(int Node,int L,int R)
{
if(L>=X && R<=Y)
{
Rez=max(Rez,Arb[Node]);
return;
}
int M=(L+R)/2;
int LS=2*Node;
int RS=LS+1;
if(X<=M) Query(LS,L,M);
if(Y>M) Query(RS,M+1,R);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d%d",&N,&M);
for(i=1;i<=N;i++) scanf("%d",&A[i]);
Build(1,1,N);
for(;M;M--)
{
scanf("%d",&i);
if(i==0)
{
scanf("%d%d",&X,&Y);
Rez=0; Query(1,1,N);
printf("%d\n",Rez);
}
else
{
scanf("%d%d",&poz,&val);
Update(1,1,N);
}
}
return 0;
}