#include <fstream>
#define DIM 300000
#define INF 2000000000
using namespace std;
int A[DIM];
int n, a, b, p, v, i, q, t, sol;
inline int maxim(int a, int b) {
return (a > b ? a : b);
}
void update(int nod, int st, int dr, int p, int v) {
if (st == dr) {
A[nod] = v;
return;
}
int m = (st + dr) / 2;
if (p <= m)
update(2*nod, st, m, p, v);
if (p > m)
update(2*nod+1, m+1, dr, p, v);
A[nod] = maxim(A[2*nod], A[2*nod+1]);
}
void query(int nod, int st, int dr, int a, int b) {
if (a<=st && b>=dr) {
sol = maxim (A[nod], sol);
return;
}
int m = (st + dr)/2;
if (a <= m)
query(2*nod, st, m, a, b);
if (b>=m+1)
query(2*nod+1, m+1, dr, a, b);
}
int main() {
ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin>>n>>q;
for (i=1;i<=n;i++) {
fin>>v;
update(1, 1, n, i, v);
}
for (;q;q--) {
fin>>t;
if (t == 1) {
fin>>p>>v;
update(1, 1, n, p, v);
} else {
fin>>a>>b;
sol = -INF;
query(1, 1, n, a, b);
fout<<sol<<"\n";
}
}
return 0;
}