#include <fstream>
#define DIM 300000
#define INF 2000000000
using namespace std;
int A[DIM];
int n, a, b, p, v, i, q, t;
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]);
}
int query(int nod, int st, int dr, int a, int b) {
if (a<=st && b>=dr)
return A[nod];
int m = (st + dr)/2;
int stanga = -INF;
int dreapta = -INF;
if (a <= m)
stanga = query(2*nod, st, m, a, b);
if (b>=m+1)
dreapta = query(2*nod+1, m+1, dr, a, b);
return maxim(stanga, dreapta);
}
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;
fout<<query(1, 1, n, a, b)<<"\n";
}
}
return 0;
}