#include <bits/stdc++.h>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
typedef long long ll;
typedef unsigned long long ull;
const ll nmx = 100005;
const ll inf = 1<<30;
class segmTree {
private:
ll _val[4 * nmx];
ll _nodes;
void _upd(ll left, ll right, ll node, ll pos, ll val) {
if(left == right) {
_val[node] = val;
}
else {
ll mid = (left + right) / 2;
if(pos <= mid) _upd(left, mid, 2 * node, pos, val);
else _upd(mid + 1, right, 2 * node + 1, pos, val);
_val[node] = max(_val[2 * node], _val[2 * node + 1]);
}
}
void _query(ll left, ll right, ll node, ll l, ll r, ll &mx) {
if(l <= left && right <= r) {
mx = max(mx, _val[node]);
}
else {
ll mid = (left + right) / 2;
if(l <= mid) _query(left, mid, 2 * node, l, r, mx);
if(r > mid) _query(mid + 1, right, 2 * node + 1, l, r, mx);
}
}
public:
segmTree(ll n) {
for(int i = 0; i < 4 * nmx; ++i) {
_val[i] = 0;
}
_nodes = n;
}
void update(const ll &pos, const ll &val) {
_upd(1, _nodes, 1, pos, val);
}
ll query(const ll &left, const ll &right) {
ll mx = 0;
_query(1, _nodes, 1, left, right, mx);
return mx;
}
};
int main() {
ios::sync_with_stdio(0);
ll N, M, v[nmx];
in>>N>>M;
segmTree tree(N);
for(int i = 1; i <= N; ++i) {
in>>v[i];
tree.update(i, v[i]);
}
while(M--) {
ll op, a, b;
in>>op>>a>>b;
if(op == 0) {
out<<tree.query(a, b)<<"\n";
}
else {
tree.update(a, b);
}
}
return 0;
}