#include<fstream>
#include<iostream>
#define MAX_N 100000
#define oo 0x7fffffff
using namespace std;
class segmentTree {
private:
int segTree[4*MAX_N + 1], arr[MAX_N + 1];
int n;
public:
void updateSegmentTree(int low, int high, int pos, int a, int b) {
if(low == high)
segTree[pos] = b;
else {
int mid = (low + high) >> 1;
if(a <= mid)
updateSegmentTree(low, mid, 2*pos, a, b);
else updateSegmentTree(mid + 1, high, 2*pos + 1, a, b);
segTree[pos] = max(segTree[2*pos], segTree[2*pos + 1]);
}
}
void buildSegmentTree(int low, int high, int pos) {
if(low == high)
segTree[pos] = arr[low];
else {
int mid = (low + high) >> 1;
buildSegmentTree(low, mid, 2*pos);
buildSegmentTree(mid + 1, high, 2*pos + 1);
segTree[pos] = max(segTree[2*pos], segTree[2*pos + 1]);
}
}
int maxQuery(int low, int high, int pos, int qlow, int qhigh) {
if(qlow <= low && high <= qhigh)
return segTree[pos];
if(qlow > high || qhigh < low)
return -oo;
int mid = (low + high) >> 1;
return max(maxQuery(low, mid, 2*pos, qlow, qhigh),
maxQuery(mid + 1, high, 2*pos + 1,qlow, qhigh));
}
void readArray(string name_fin, string name_fout) {
int m, op, x, y, i;
ifstream fin(name_fin);
ofstream fout(name_fout);
fin >> n >> m;
for(i = 1; i <= n; i++)
fin >> arr[i];
buildSegmentTree(1, n, 1);
for(i = 1; i <= m; i++) {
fin >> op >> x >> y;
if(op == 0)
fout << maxQuery(1, n, 1, x, y) << "\n";
else updateSegmentTree(1, n, 1, x, y);
}
fin.close();
fout.close();
}
};
int main() {
segmentTree s;
s.readArray("arbint.in","arbint.out");
return 0;
}