#include <iostream>
#include <fstream>
using namespace std;
int n, m, val_max;
int v[262144];
ifstream r("arbint.in");
ofstream w("arbint.out");
//cea mai mare putere
long cmmp(long val){
long n=1;
while(n < 2*val-1) n <<= 1;
return n;
}
int Max(int a, int b){
if(a > b) return a;
return b;
}
void update(int v[], int val, int st, int dr, int poz, int node){
if(st == dr){
v[node] = val;
return;
}
int mij = (st+dr)/2;
if(poz <= mij) update(v, val, st, mij, poz, 2*node);
else update(v, val, mij+1, dr, poz, 2*node+1);
v[node] = Max(v[2*node], v[2*node+1]);
}
void query(int v[], int st, int dr, int a, int b, int node){
if(a <= st && b >= dr){
val_max = Max(val_max, v[node]);
return;
}
int mij = (st+dr)/2;
if(a <= mij) query(v, st, mij, a, b, node*2);
if(mij < b) query(v, mij+1, dr, a, b ,node*2+1);
}
int main(){
int c, a, b, i;
r>>n>>m;
for(i=1; i<=n; i++){
r>>c;
update(v, c, 1, n, i, 1);
}
for(i=1; i<=n; i++){
r>>c>>a>>b;
if(c == 0){
val_max = -1;
query(v, 1, n, a, b, 1);
w<<val_max<<endl;
}
else update(v, b, 1, n, a, 1);
}
return 0;
}