#include <fstream>
#define DIM 100010
using namespace std;
int A[4*DIM];
int n, m, i, a, b, sol, x, 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){
sol = maxim(sol, A[nod]);
return A[nod];
}
int mst = 0, mdr = 0, m = (st+dr)/2;
if (a<=m)
mst = query(2*nod, st, m, a, b);
if (b > m)
mdr = query(2*nod+1, m+1, dr, a, b);
return maxim(mst, mdr);
}
int main() {
ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin>>n>>m;
for (i=1;i<=n;i++) {
fin>>x;
update(1, 1, n, i, x);
}
for (i=1;i<=m;i++) {
fin>>t>>a>>b;
if (t == 0) {
sol = 0;
query(1,1,n,a,b);
fout<<sol<<"\n";
}
else
update(1,1,n,a,b);
}
return 0;
}