#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9 + 1;
const int MAXN = 1e5;
int seg[4 * MAXN + 1];
int v[4 * MAXN + 1];
int a, b;
void build (int st, int dr, int pos) {
if (st == dr) {
seg[pos] = v[st];
}
else {
int mid = (st + dr) / 2;
build (st, mid, 2 * pos);
build (mid + 1, dr, 2 * pos + 1);
seg[pos] = max (seg[2 * pos], seg[2 * pos + 1]);
}
}
void update (int st, int dr, int pos) {
if (st == dr) {
seg[pos] = b;
}
else {
int mij = (st + dr) / 2;
if (a <= mij) {
update (st, mij, 2 * pos);
}
else {
update (mij + 1, dr, 2 * pos + 1);
}
seg[pos] = max (seg[2 * pos], seg[2 * pos + 1]);
}
}
int rmq (int st, int dr, int pos) {
if (a <= st && dr <= b) {
return seg[pos];
}
else {
if (a > dr || b < st)
return -INF;
else {
int mij = (st + dr) / 2;
return max(rmq (st, mij, 2 * pos), rmq (mij + 1, dr, 2 * pos + 1));
}
}
}
int main() {
FILE *fin, *fout;
int n, m, c, i;
fin = fopen ("arbint.in", "r");
fout = fopen ("arbint.out", "w");
fscanf (fin, "%d%d", &n, &m);
for (i = 1; i <= n; i++) {
fscanf (fin, "%d", &v[i]);
}
build (1, n, 1);
while (m--) {
fscanf (fin, "%d%d%d", &c, &a, &b);
if (c == 1)
update (1, n, 1);
else {
fprintf (fout, "%d\n", rmq (1, n, 1));
}
}
return 0;
}