#include <bits/stdc++.h>
#define N 100100
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
class Aint {
private:
int sol;
int n;
int v[N<<2];
void go(int A[], int st, int dr, int po) {
if (st == dr) {
v[po] = A[st];
return;
}
int mij = (st + dr) >> 1;
go(A, st, mij, po << 1);
go(A, mij + 1, dr, (po << 1) + 1);
v[po] = max(v[po << 1], v[(po << 1) + 1]);
};
void find(int st, int dr, int po, int l, int r) {
if (st >= l && dr <= r) {
sol = max(sol, v[po]);
return;
}
int mij = (st + dr) >> 1;
if (l <= mij) {
find(st, mij, po << 1, l, r);
}
if (r > mij) {
find(mij + 1, dr, (po << 1) + 1, l, r);
}
};
void update(int st, int dr, int po, int p, int x) {
if (st == dr) {
v[po] = x;
return;
}
int mij = (st + dr) >> 1;
if (p <= mij) {
update(st, mij, po << 1, p, x);
} else {
update(mij + 1, dr, (po << 1) + 1, p, x);
}
v[po] = max (v[po << 1], v[(po << 1) + 1]);
};
public :
Aint (int values[], int size) {
go(values, 1, size, 1);
n = size;
};
int fnd(int st, int dr) {
sol = 0;
find(1, n, 1, st, dr);
return sol;
};
void upd(int poz,int x) {
update(1, n, 1, poz, x);
};
};
int v[N], n, l, r, q, x, t, p;
int main () {
fin >> n >> q;
for (int i = 1; i <= n; ++i) {
fin >> v[i];
}
Aint a = Aint(v, n);
for (int i = 1; i <= q; ++i) {
fin >> t;
if (!t) {
fin >> l >> r;
fout << a.fnd(l, r) << "\n";
} else {
fin >> p >> x;
a.upd(p, x);
}
}
return 0;
}