#include <fstream>
#include <cmath>
#define max(a, b) ((a > b) ? (a) : (b))
#define MAX 100005
using namespace std;
ifstream fin ("arbint.in");
ofstream fout("arbint.out");
int arr[MAX], n, m;
int arbore[2 * MAX + 5];
int max_intervals(int left, int right, int son) {
if (arbore[son])
return arbore[son];
if (left == right) {
arbore[son] = arr[left];
return arr[left];
}
int mid = (left + right) / 2;
arbore[son] = max(max_intervals(left, mid, 2 * son),
max_intervals(mid + 1, right, 2 * son + 1));
}
void update(int left, int right, int a, int b, int son) {
if (left == right) {
arr[left] = arbore[son] = b;
return;
}
int mid = left + (right - left) / 2;
if (a >= mid + 1)
update(mid + 1, right, a, b, 2 * son + 1);
else
update(left, mid, a, b, 2 * son);
arbore[son] = max(arbore[2 * son], arbore[2 * son + 1]);
}
int getMax(int left, int right,int a, int b, int son) {
if ((left == a and right == b) or (left == right))
return arbore[son];
int mid = left + (right - left) / 2;
if ( (a >= left and a <= mid) and (b >= mid + 1 and b <= right))
return max(getMax(left, mid ,a, b, 2 * son), getMax(mid + 1, right, a, b, 2 * son + 1));
if ((a >= left and a <= mid) and (b >= left and b <= mid))
return getMax(left, mid, a, b, 2 * son);
if ((a >= mid + 1 and a <= right) and (b >= mid + 1 and b <= right))
return getMax(mid + 1, right, a, b, 2 * son + 1);
}
int main() {
fin >> n >> m;
for (int i = 1;i <= n;i ++)
fin >> arr[i];
max_intervals(1, n, 1);
int operation, a, b;
for (int i = 1;i <= m;i ++) {
fin >> operation >> a >> b;
if (operation)
update(1, n, a, b, 1);
else
fout << getMax(1, n, a, b, 1) << '\n';
}
return 0;
}