#include <bits/stdc++.h>
#define ll long long
#define cin fin
#define cout fout
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m;
int cost[400010], v[100001], logBase2[100001];
void update(int node, int l, int r, int ind, int val) {
// cout << l << ' ' << r << '\n';
if (l == r) {
cost[node] = val;
return;
}
int mid = (l + r) / 2;
if (ind >= l && ind <= mid)
update(2 * node, l, mid, ind, val);
else
update(2 * node + 1, mid + 1, r, ind, val);
cost[node] = max(cost[node * 2], cost[node * 2 + 1]);
}
int query(int node, int l, int r, int wantL, int wantR) {
// cout << l << ' ' << r << '\n';
if (l >= wantL && r <= wantR)
return cost[node];
int currMax = 0;
int mid = (l + r) / 2;
if (wantL <= mid)
currMax = max(currMax, query(2 * node, l, mid, wantL, wantR));
if (wantR > mid)
currMax = max(currMax, query(2 * node + 1, mid + 1, r, wantL, wantR));
return currMax;
}
int main() {
ios :: sync_with_stdio(0);
cin.tie(0);
cin >> n >> m;
for (int i = 2; i <= n; ++i)
logBase2[i] = logBase2[i / 2] + 1;
for (int i = 1; i <= n; ++i) {
cin >> v[i];
// cout << i << ":\n";
update(1, 1, n, i, v[i]);
}
for (int q = 1; q <= m; ++q) {
int type;
cin >> type;
if (type) {
int ind, val;
cin >> ind >> val;
v[ind] = val;
update(1, 1, n, ind, val);
} else {
int wantL, wantR;
cin >> wantL >> wantR;
cout << query(1, 1, n, wantL, wantR) << '\n';
}
}
// for (int i = 1; i <= n; ++i)
// for (int j = i; j <= n; ++j) {
// cout << '(' << i << ", " << j << ") -> " << query(1, 1, n, i, j) << '\n';
// }
// cout << query(1, n, 3, 4);
// cout << cost[1][2];
// for (int i = 1; i <= n; ++i)
// cout << cost[i][0] << ' ';
return 0;
}