#include <cstdio>
using namespace std;
#define NMAX 1<<19
#define max(a,b) ((a>b) ? a : b)
int Tree[NMAX];
int P,X,A,B,i,type,N,M;
void Update(int nod,int L,int R)
{
int M;
if (L>=R)
{
Tree[nod]=X;
return;
}
M=(L+R)/2;
if (P<=M) Update(2*nod,L,M);
else Update(2*nod+1,M+1,R);
Tree[nod]=max(Tree[2*nod],Tree[2*nod+1]);
}
int Query(int nod,int L,int R)
{
int M=(L+R)/2,leftM=0,rightM=0;
if (A<=L && R<=B) return Tree[nod];
if (A<=M) leftM=Query(nod*2,L,M);
if (B>M) rightM=Query(nod*2+1,M+1,R);
return max(leftM,rightM);
}
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",&X);
P=i;
Update(1,1,N);
}
while (M--)
{
scanf("%d%d%d",&type,&A,&B);
if (type==1)
{
P=A;
X=B;
Update(1,1,N);
continue;
}
printf("%d\n",Query(1,1,N));
}
return 0;
}