/**
* Author: Andu Scheusan (not_andu)
* Created: 08.11.2023 18:05:13
*/
#include <bits/stdc++.h>
#pragma GCC optimize("O3")
using namespace std;
#define INFILE "arbint.in"
#define OUTFILE "arbint.out"
typedef long long ll;
const int VMAX = 1e5 + 5;
int n, queries, t;
int v[VMAX], aint[VMAX * 4];
void build(int st, int dr, int i){
if(st == dr){
aint[i] = v[st];
return;
}
int mij = (st + dr) / 2;
build(st, mij, 2 * i);
build(mij + 1, dr, 2 * i + 1);
aint[i] = max(aint[2 * i], aint[2 * i + 1]);
}
void update(int st, int dr, int i, int j, int v){
if(st == dr){
aint[i] = v;
return;
}
int mij = (st + dr) / 2;
if(j <= mij)
update(st, mij, 2 * i, j, v);
else
update(mij + 1, dr, 2 * i + 1, j, v);
aint[i] = max(aint[2 * i], aint[2 * i + 1]);
}
int query(int st, int dr, int i, int l, int r){
if(l <= st && dr <= r){
return aint[i];
}
int mij = (st + dr) / 2;
if(r <= mij){
return query(st, mij, 2 * i, l, r);
}else if(l >= mij + 1){
return query(mij + 1, dr, 2 * i + 1, l, r);
}
return max(query(st, mij, 2 * i, l, r),query(mij + 1, dr, 2 * i + 1, l, r));
}
void solve(){
cin >> n >> queries;
for(int i = 1; i <= n; ++i) cin >> v[i];
build(1, n, 1);
for(int i = 0; i < queries; ++i){
int tip, a, b; cin >> tip >> a >> b;
if(tip == 0){
cout << query(1, n, 1, a, b) << '\n';
}
else{
update(1, n, 1, a, b);
}
}
}
int main(){
ios_base::sync_with_stdio(false);
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
cin.tie(nullptr);
cout.tie(nullptr);
solve();
return 0;
}