#include <fstream>
#define NMAX 100005
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n, m;
int arr[NMAX], arb[4*NMAX];
void build(int st, int dr, int trPoz) {
if (st == dr) {
arb[trPoz] = arr[st];
return;
}
int mij = (st + dr) / 2;
build(st, mij, 2*trPoz);
build(mij+1, dr, 2*trPoz+1);
arb[trPoz] = max(arb[2*trPoz], arb[2*trPoz+1]);
}
void update(int st, int dr, int trPoz, int finPoz, int val) {
if (st == dr) {
arb[trPoz] = val;
return;
}
int mij = (st + dr) / 2;
if (mij >= finPoz) update(st, mij, 2*trPoz, finPoz, val);
else update(mij+1, dr, 2*trPoz+1, finPoz, val);
arb[trPoz] = max(arb[2*trPoz], arb[2*trPoz+1]);
}
int interv(int st, int dr, int trPoz, int a, int b) {
if (st >= a && dr <= b)
return arb[trPoz];
if (dr < a || st > b)
return -1;
int mij = (st + dr) / 2;
return max(interv(st, mij, 2*trPoz, a, b), interv(mij+1, dr, 2*trPoz+1, a, b));
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; ++i)
in >> arr[i];
build(1, n, 1);
while (m) {
int p, a, b;
in >> p >> a >> b;
if (p == 0) out << interv(1, n, 1, a, b) << '\n';
else update(1, n, 1, a, b);
m--;
}
return 0;
}