#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, v[100004], maxOfInterval[400404], ans;
void update(int left, int right, int pos, int val, int nodeID) {
if (left == right) {
maxOfInterval[nodeID] = val;
return;
}
int mid = (left + right) / 2;
if (mid >= pos)
update(left, mid, pos, val, nodeID * 2);
else
update(mid + 1, right, pos, val, nodeID * 2 + 1);
maxOfInterval[nodeID] = max(maxOfInterval[nodeID * 2], maxOfInterval[nodeID * 2 + 1]);
}
void query(int left, int right, int wantLeft, int wantRight, int nodeID) {
if (left >= wantLeft && right <= wantRight) {
ans = max(ans, maxOfInterval[nodeID]);
return;
}
int mid = (left + right) / 2;
if (mid >= wantLeft)
query(left, mid, wantLeft, wantRight, nodeID * 2);
if (mid + 1 <= wantRight)
query(mid + 1, right, wantLeft, wantRight, nodeID * 2 + 1);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> v[i];
update(1, n, i, v[i], 1);
}
for (int i = 1; i <= m; i++) {
int operation, wantLeft, wantRight;
cin >> operation >> wantLeft >> wantRight;
if (operation == 0) {
query(1, n, wantLeft, wantRight, 1);
cout << ans << '\n';
ans = 0;
} else
update(1, n, wantLeft, wantRight, 1);
}
return 0;
}