#include <bits/stdc++.h>
using namespace std;
const int maxn = 100005;
int v[maxn], n, m;
struct AINT {
int aint[4 * maxn];
int ans;
AINT() {
memset(aint, 0, sizeof aint);
}
void Update(int node, int nst, int ndr, int poz, int val) {
if (poz < nst || poz > ndr) return;
if (nst == ndr) {
aint[node] = val;
return;
}
int mid = (nst + ndr) / 2;
Update(2 * node, nst, mid, poz, val);
Update(2 * node + 1, mid + 1, ndr, poz, val);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
void Reset() {
ans = 0;
}
void Query(int node, int nst, int ndr, int qst, int qdr) {
if (qdr < nst || qst > ndr) return;
if (nst >= qst && ndr <= qdr) {
ans = max(ans, aint[node]);
return;
}
int mid = (nst + ndr) / 2;
Query(2 * node, nst, mid, qst, qdr);
Query(2 * node + 1, mid + 1, ndr, qst, qdr);
}
} a1;
int main()
{
ifstream cin("arbint.in");
ofstream cout("arbint.out");
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
int val;
cin >> val;
a1.Update(1, 1, n, i, val);
}
for (int i = 1; i <= m; ++i) {
int a, b, c;
cin >> a >> b >> c;
if (a == 1)
a1.Update(1, 1, n, b, c);
else a1.Reset(), a1.Query(1, 1, n, b, c), cout << a1.ans << '\n';
}
return 0;
}