#include <iostream>
#include <fstream>
#include <algorithm>
#define nmax 100005
using namespace std;
int A,B,Poz,Val,Op;
int Arb[nmax*4];
int n,m,X;
int maxim;
void Update(int n,int left,int right)
{
if(left==right)
{
Arb[n]=Val;
return;
}
int m=(left+right)/2;
if(Poz<=m)
Update(2*n,left,m);
else
Update(2*n+1,m+1,right);
Arb[n]=max(Arb[2*n],Arb[2*n+1]);
}
void Query(int n,int left,int right)
{
if(A<=left && right<=B)
{
maxim=max(maxim,Arb[n]);
return;
}
int mij=(left+right)/2;
if(A<=mij)
Query(2*n,left,mij);
if(B>mij)
Query(2*n+1,mij+1,right);
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d ",&X);
Val=X;
Poz=i;
Update(1,1,n);
}
for(int i=1;i<=m;i++)
{
scanf("%d %d %d",&X,&A,&B);
if(X==0)
{
maxim = -1;
Query(1,1,n);
printf("%d\n",maxim);
}
else
{
Poz=A;
Val=B;
Update(1,1,n);
}
}
return 0;
}