#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int MAXN = 100041;int n, m, sir[MAXN], arbint[4 * MAXN];
void citire(){in >> n >> m;for(int i = 1; i <= n; i++) in >> sir[i];}
void constructie(int st, int dr, int nod = 1){if(st == dr){arbint[nod] = sir[st];return;}int mij = (st + dr) / 2;constructie(st, mij, nod << 1);constructie(mij + 1, dr, nod << 1 | 1);arbint[nod] = max(arbint[2 * nod], arbint[2 * nod + 1]);}
int query(int qst, int qdr, int st = 1, int dr = n, int nod = 1){if(qst <= st && dr <= qdr){return arbint[nod];}int mij = (st + dr) >> 1;int maxi = -1;if(mij >= qst)maxi = max(maxi, query(qst, qdr, st, mij, nod << 1));if (qdr > mij)maxi = max(maxi, query(qst, qdr, mij+1, dr, nod<<1 | 1));return maxi;}
void update(int pos, int val, int st = 1, int dr = n, int nod = 1){if (st == dr)arbint[nod] = val;else{int mij = (st+dr) >> 1;if (pos <= mij)update(pos, val, st, mij, nod<<1);else update(pos, val, mij+1, dr, nod<<1 | 1);arbint[nod] = max(arbint[nod<<1], arbint[nod<<1|1]);}}
int main(){citire();constructie(1, n);for(int i = 1; i <= m; i++){int op, a, b;in >> op >> a >> b;if(op == 0)out << query(a, b) << '\n';else{update(a, b);}}return 0;}