#include <stdio.h>
#include <fstream>
#define INF 2000000000
using namespace std;
ofstream fout("arbint.out");
int N,M;
int *Arb,*V;
int Create(int k,int left,int right){
if(left==right){
Arb[k]=V[left];
return V[left];
}
int m=(left+right)/2;
int v1=Create(2*k,left,m);
int v2=Create(2*k+1,m+1,right);
if(v2>v1)
v1=v2;
Arb[k]=v1;
return v1;
}
int Query1(int k,int a,int b,int left,int right){
if(a<=left&&right<=b){
return Arb[k];
}
int v1=-INF,v2=-INF,m=(left+right)/2;
if(a<=m)
v1=Query1(2*k,a,b,left,m);
if(m+1<=b)
v2=Query1(2*k+1,a,b,m+1,right);
if(v1>v2)
return v1;
return v2;
}
int Query2(int k,int a,int b,int left,int right){
if(left==right){
Arb[k]=b;
return b;
}
int m=(left+right)/2;
int v1,v2;
if(a<=m){
v1=Query2(2*k,a,b,left,m);
v2=Arb[2*k+1];
}
else{
v1=Query2(2*k+1,a,b,m+1,right);
v2=Arb[2*k];
}
if(v2>v1)
v1=v2;
Arb[k]=v1;
return v1;
}
void Read(){
freopen("arbint.in","r",stdin);
scanf("%d %d\n",&N,&M);
int i;
V=new int [N+5];
Arb=new int [3*N];
for(i=1;i<=N;i++)
scanf("%d ",&V[i]);
Create(1,1,N);
int nr,a,b;
for(i=1;i<=M;i++){
scanf("%d %d %d\n",&nr,&a,&b);
if(nr==0)
fout<<Query1(1,a,b,1,N)<<'\n';
else
Query2(1,a,b,1,N);
}
fclose(stdin);
fout.close();
}
int main()
{
Read();
return 0;
}