#include<fstream>
#define MAX_N 100000
#define oo 0x7fffffff
using namespace std;
class segmentTree {
private:
int v[MAX_N + 1], segTree[4*MAX_N + 1], n;
public:
void buildSegmentTree(int low, int high, int pos) {
if(low == high)
segTree[pos] = v[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]);
}
}
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]);
}
}
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 i, nr, a, b, m;
ifstream fin(name_fin);
ofstream fout(name_fout);
fin >> n >> m;
for(i = 1; i <= n; i++)
fin >> v[i];
buildSegmentTree(1, n, 1);
for(i = 1; i <= m; i++) {
fin >> nr >> a >> b;
if(nr == 0)
fout << maxQuery(1, n, 1, a, b) << "\n";
else updateSegmentTree(1, n, 1, a, b);
}
fin.close();
fout.close();
}
};
int main() {
segmentTree s;
s.readArray("arbint.in", "arbint.out");
return 0;
}