#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int N = 100041;
int n, m;
int tre[N*4];
int nodecount(int a){
return a*2-1;
}
int shusta(int a){
int r = 1;
while(r*2+1 < a){
r = r*2+1;
}
return r;
}
void meinit(){
int nc = nodecount(n);
int pp = shusta(nc);
for(int i = pp+1; i <= nc; ++i){
fin >> tre[i];
}
for(int i = n; i <= pp; ++i){
fin >> tre[i];
}
for(int i = n-1; i >= 1; --i){
tre[i] = max(tre[i*2], tre[i*2+1]);
}
}
void _deb(int cp=1){
cout << tre[cp];
if(tre[cp*2] || tre[cp*2+1]){
cout << "{";
bool c=false;
if(tre[cp*2]){_deb(cp*2);c=true;}
if(tre[cp*2+1]){if(c){cout<<" ";}_deb(cp*2+1);}
cout << "}";
}
}
void deb(){
_deb();
cout << "\n";
}
void meset(int p, int v, int cp=1, int clt=1, int crt=n){
if(clt == crt){
tre[cp] = v;
}else{
int mid = (clt+crt)/2;
if(p >= clt && p <= mid){
meset(p, v, cp*2, clt, mid);
}else{
meset(p, v, cp*2+1, mid+1, crt);
}
tre[cp] = max(tre[cp*2], tre[cp*2+1]);
}
}
int meget(int lt, int rt, int cp=1, int clt=1, int crt=n){
int mid = (clt+crt)/2;
if(clt == lt && crt == rt){
return tre[cp];
}else if(lt >= clt && rt <= mid){
return meget(lt, rt, cp*2, clt, mid);
}else if(lt > mid && rt <= crt){
return meget(lt, rt, cp*2+1, mid+1, crt);
}else{
return max(
meget(lt, mid, cp*2, clt, mid),
meget(mid+1, rt, cp*2+1, mid+1, crt));
}
}
int main(){
// ios_base::sync_with_stdio(false);
fin >> n >> m;
meinit();
for(int i = 0; i < m; ++i){
int op, a, b;
fin >> op >> a >> b;
if(op == 0){
fout << meget(a, b) << "\n";
}else{
meset(a, b);
}
}
return 0;
}