#include <iostream>
#include <fstream>
using namespace std;
#define MAXN 100010
FILE* f = fopen("arbint.in", "r");
FILE* g = fopen("arbint.out", "w");
int n;
int aint[3 * MAXN];
void update(int poz, int val, int st = 1, int dr = n, int nod = 1)
{
if (st == dr) {
aint[nod] = val;
return ;
}
int mij = ((st + dr) >> 1);
if (poz <= mij) {
update(poz, val, st, mij, nod << 1);
} else {
update(poz, val, mij + 1, dr, (nod << 1) + 1);
}
aint[nod] = max(aint[nod << 1], aint[(nod << 1) + 1]);
}
int query(int x, int y, int st = 1, int dr = n, int nod = 1)
{
if (x <= st && dr <= y) {
return aint[nod];
}
int mx = 0;
int mij = ((st + dr) >> 1);
if (x <= mij) {
mx = max(mx, query(x, y, st, mij, nod << 1));
}
if (y > mij) {
mx = max(mx, query(x, y, mij + 1, dr, (nod << 1) + 1));
}
return mx;
}
int main()
{
int m;
fscanf (f, "%d %d\n", &n, &m);
for (int i = 1, x; i <= n; i++) {
fscanf(f, "%d ", &x);
update(i, x);
}
for (int i = 1, op, x, y; i <= m; i++) {
fscanf(f, "%d %d %d\n", &op, &x, &y);
switch (op) {
case 0: fprintf(g, "%d\n", query(x, y)); break;
case 1: update(x, y); break;
}
}
fclose(f);
fclose(g);
return 0;
}