#include <iostream>
#include <fstream>
#define minim -1
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n , m , a , b , q , tree[400005];
void update(int node , int st , int dr , int poz , int val){
if(st == dr){
tree[node] = val;
return;
}
int m = (st + dr)/2;
if(poz <= m){
update(2*node , st , m , poz , val);
}
else if(poz > m){
update(2*node+1 , m+1 , dr , poz , val);
}
tree[node]=max(tree[2*node] , tree[2*node + 1]);
}
int get(int node , int st , int dr , int a , int b){
if((a <= st) && (dr <= b)){
return tree[node];
}
int vmax = minim;
int m = (st + dr)/2;
if(a <= m){
vmax = max(vmax , get(2*node , st , m , a , b));
}
if(m < b){
vmax = max(vmax , get(2*node+1 , m+1 , dr , a , b));
}
return vmax;
}
int main()
{
fin>>n>>m;
for(int i=1 ; i<=4*n ; i++)
tree[i]=minim;
for(int i=1 ; i<=n ; i++){
int x;
fin>>x;
update(1 , 1 , n , i , x);
}
for(int i=1 ; i<=m ; i++){
fin>>q>>a>>b;
if(q == 1){
update(1 , 1 , n , a , b);
}
else{
fout<<get(1 , 1 , n , a , b)<<'\n';
}
}
return 0;
}