#include <fstream>
#include <vector>
#include <algorithm>
#include <math.h>
using namespace std;
vector<int> v;
int val;
const int interval = 100000;
void update(int node, int left, int right, int a, int b)
{
if (a <= left && right <= b) {
v[node] = val;
} else {
int mid = left + ((right - left) >> 1);
if (a <= mid) {
update(node << 1, left, mid, a, b);
}
if (b > mid) {
update((node << 1) + 1, mid + 1, right, a, b);
}
v[node] = max(v[(node << 1) + 1], v[node << 1]);
}
}
int query(int node, int left, int right, int a, int b)
{
if (a <= left && right <= b)
return v[node];
int l_v = 0, r_v = 0;
int mid = left + ((right - left) >> 1);
if (a <= mid) {
l_v = query(node << 1, left, mid, a, b);
}
if (b > mid) {
r_v = query((node << 1) + 1, mid + 1, right, a, b);
}
return max(l_v, r_v);
}
int main()
{
int N, M, op, pos1, pos2;
ifstream in; ofstream out;
in.open("arbint.in"); out.open("arbint.out");
in >> N >> M;
v.insert(v.begin(), pow(2, 18), 0);
for (int i = 0; i < N; i++) {
in >> val;
update(1, 1, N, i + 1, i + 1);
}
for (int i = 0; i < M; i++) {
in >> op;
if (op) {
in >> pos1 >> val;
update(1, 1, N, pos1, pos1);
} else {
in >> pos1 >> pos2;
out << query(1, 1, N, pos1, pos2) << "\n";
}
}
in.close();
out.close();
return 0;
}