#include <fstream>
#define MAX_N 100004
#define common_up m = (l + r) / 2, L = n << 1, R = L | 1
using namespace std;
const char iname[] = "arbint.in";
const char oname[] = "arbint.out";
ifstream fin(iname);
ofstream fout(oname);
int N, M, i, j, a, b, op;
int H[3 * MAX_N];
int v[MAX_N];
inline void update (int n, int l, int r, int p, int v){
if (l == r){H[n] = v; return;}
int common_up;
if (p <= m) update (L, l, m, p, v);
else
update (R, m + 1, r, p, v);
H[n] = max(H[L], H[R]);
}
inline int query (int n, int l, int r, int i, int j){
if (i <= l && r <= j) return H[n];
int m = (l + r) / 2; int sol = 0;
if (i <= m) sol = max(sol, query(2 * n, l, m, i, j));
if (j > m) sol = max(sol, query(2 * n + 1, m + 1, r, i, j));
return sol;
}
void build (int n, int l, int r){
if (l == r){H[n] = v[l]; return;}
int common_up;
build (L, l, m);
build (R, m + 1, r);
H[n] = max(H[R], H[L]);
}
int main()
{
fin >> N >> M;
for (i = 1; i <= N; ++i) fin >> v[i];
build (1, 1, N);
while(M--)
{
fin >> op;
if (op){
fin >> a >> b;
update (1, 1, N, a, b);
}
else
{
fin >> a >> b;
fout << query (1, 1, N, a, b) << '\n';
}
}
return 0;
}