//Alex Postu
#include <bits/stdc++.h>
using namespace std;
static const int NMAX = 1e5;
int segTree[4*NMAX];
void update(int idx, int value, int leaf, int l, int r) {
if ( l == r ) {
segTree[leaf] = value;
return;
}
int mid = l+(r-l)/2;
if ( idx <= mid ) {
update(idx, value, 2*leaf, l, mid);
}
else {
update(idx, value, 2*leaf+1, mid+1, r);
}
segTree[leaf] = max(segTree[2*leaf], segTree[2*leaf+1]);
}
int query(int l, int r, int a, int b, int leaf) {
if ( l >= a && b >= r ) {
return segTree[leaf];
}
int answer = 0;
int mid = l+(r-l)/2;
if ( mid >= a ) {
answer = max(answer, query(l ,mid, a, b, 2*leaf));
}
if ( mid < b ) {
answer = max(answer, query(mid+1, r, a, b, 2*leaf+1));
}
return answer;
}
int main() {
#ifdef ONLINE_JUDGE
freopen("input.in", "r", stdin);
freopen("output.out", "w", stdout);
#else
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
#endif
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
int n, m;
cin>>n>>m;
for ( int i = 1; i <= n; ++i ) {
int x;
cin>>x;
update(i, x, 1, 1, n);
}
for ( int i = 1; i <= m; ++i ) {
int type, a, b;
cin>>type>>a>>b;
if ( type == 0 ) {
cout<<query(1, n, a, b, 1)<<'\n';
}
else {
update(a, b, 1, 1, n);
}
}
}