/**
* Author: Andu Scheusan (not_andu)
* Created: 29.11.2023 19:18:40
*/
#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 = 100005;
const int INF = -1e9;
int n, queries;
int ans, aint[4 * VMAX];
void build(int node, int left, int right){
if(left == right){
cin >> aint[node];
}
else{
int middle = (left + right) / 2;
build(2 * node, left, middle);
build(2 * node + 1, middle + 1, right);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
void query(int node, int left, int right, int x, int y){
if(x <= left && right <= y){
ans = max(ans, aint[node]);
}
else{
int middle = (left + right) / 2;
if(x <= middle){
query(2 * node, left, middle, x, y);
}
if(y > middle){
query(2 * node + 1, middle + 1, right, x, y);
}
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
void update(int node, int left, int right, int x, int y){
if(left == right){
aint[node] = y;
}
else{
int middle = (left + right) / 2;
if(x <= middle){
update(2 * node, left, middle, x, y);
}
else{
update(2 * node + 1, middle + 1, right, x, y);
}
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
void solve(){
cin >> n >> queries;
build(1, 1, n);
for(int i = 0; i < queries; ++i){
int task, a, b; cin >> task >> a >> b;
if(task == 0){
ans = INF;
query(1, 1, n, a, b);
cout << ans << '\n';
}
else{
update(1, 1, n, 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;
}