#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define INFILE "arbint.in"
#define OUTFILE "arbint.out"
const int N_MAX = 100005;
int n, queries;
int aint[4 * N_MAX];
void build(int node, int left, int right){
if(left == right) cin >> aint[node];
else{
int middle = (left + right) >> 1;
build(2 * node, left, middle);
build(2 * node + 1, middle + 1, right);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
void update(int node, int left, int right, int position, int value){
if(left == right) aint[node] = value;
else{
int middle = (left + right) >> 1;
if(position <= middle) update(2 * node, left, middle, position, value);
else update(2 * node + 1, middle + 1, right, position, value);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
int query(int node, int left, int right, int x, int y){
if(x <= left && right <= y) return aint[node];
int middle = (left + right) >> 1;
if(y <= middle) return query(2 * node, left, middle, x, y);
else if(x > middle) return query(2 * node + 1, middle + 1, right, x, y);
return max(query(2 * node, left, middle, x, y), query(2 * node + 1, middle + 1, right, x, y));
}
void solve(){
cin >> n >> queries;
build(1, 1, n);
for(int i = 0; i < queries; ++i){
short type; ll x, y; cin >> type >> x >> y;
if(type == 0) cout << query(1, 1, n, x, y) << '\n';
else update(1, 1, n, x, y);
}
}
int main(){
ios_base::sync_with_stdio(false);
freopen(INFILE, "r", stdin);
freopen(OUTFILE, "w", stdout);
cin.tie(0), cout.tie(0);
solve();
return 0;
}