#include<bits/stdc++.h>
#define in f
#define out g
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
int const MAXSIZE = 40000010;
int arb[MAXSIZE];
int n, m, code, a, b, x, k;
int interval(int a, int b, int node, int l, int r) {
//out << node << " ";
if (a <= l && b >= r)
k = max(k, arb[node]);
else {
int mid = (l + r) / 2;
if (a <= mid)
interval(a, b, node * 2, l, mid);
if (b > mid)
interval(a, b, node * 2 + 1, mid + 1, r);
}
}
int change(int a, int val, int node, int l, int r) {
if (l == r) {
arb[node] = val;
} else {
int mid = (l + r) / 2;
if (a <= mid)
change(a, val, node * 2, l, mid);
if (a > mid)
change(a, val, node * 2 + 1, mid + 1, r);
arb[node] = max (arb[2 * node], arb[2 * node + 1]);
}
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; i++) {
in >> x;
change(i, x, 1, 1, n);
}
for (int i = 1; i <= m; i++) {
in >> code >> a >> b;
if (code == 0) {
k = 0;
interval(a, b, 1, 1, n);
out << k << endl;
} else {
change(a, b, 1, 1, n);
}
}
return 0;
}