#include <iostream>
#include <fstream>
#define NMAX 300005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int N, M;
int a[NMAX];
void update(int node, int left, int right, int poz, int val) {
if (left == right) {
a[node] = val;
return;
}
int ls = 2 * node, rs = 2 * node + 1;
int mid = (left + right) / 2;
if (left <= poz && poz <= mid) {
update(ls, left, mid, poz, val);
}
else {
update(rs, mid + 1, right, poz, val);
}
a[node] = max(a[ls], a[rs]);
}
int query(int node, int left, int right, int lpoz, int rpoz) {
if (lpoz == left && rpoz == right) {
return a[node];
}
int ls = 2 * node, rs = 2 * node + 1;
int mid = (left + right) / 2;
if (left <= lpoz && rpoz <= mid) {
return query(ls, left, mid, lpoz, rpoz);
}
if (mid + 1 <= lpoz && rpoz <= right) {
return query(rs, mid + 1, right, lpoz, rpoz);
}
return max(query(ls, left, mid, lpoz, mid), query(rs, mid + 1, right, mid + 1, rpoz));
}
void read() {
fin >> N >> M;
int nr;
for (int i = 1; i <= N; ++i) {
fin >> nr;
update(1, 1, N, i, nr);
}
}
int main()
{
read();
int t, a, b;
for (int i = 1; i <= M; ++i) {
fin >> t >> a >> b;
if (t == 1) {
update(1, 1, N, a, b);
}
else {
fout << query(1, 1, N, a, b) << "\n";
}
}
fout << "\n";
return 0;
}