#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int MAX = 1e5 + 1;
int arb[4 * MAX], n, m, v[MAX], sol;
void build(int node, int l, int r){
if (l == r){
arb[node] = v[l];
return;
}
int ls = node * 2,
rs = node * 2 + 1,
mid = (l + r) / 2;
build(ls, l, mid);
build(rs, mid + 1, r);
arb[node] = max(arb[ls], arb[rs]);
}
void update(int node, int l, int r, int poz, int val){
if (l == r){
arb[node] = val;
return;
}
int ls = node * 2,
rs = node * 2 + 1,
mid = (l + r) / 2;
if (poz <= mid)
update (ls, l, mid, poz, val);
else update(rs, mid + 1, r, poz, val);
arb[node] = max(arb[ls], arb[rs]);
}
void query(int node, int l, int r, int a, int b){
if (l >=a && r <= b){
if (arb[node] > sol)
sol = arb[node];
return;
}
int ls = 2 * node,
rs = 2 * node + 1,
mid = (l + r) / 2;
if (mid >= a)
query(ls, l, mid, a, b);
if (mid + 1 <= b)
query(rs, mid + 1, r, a, b);
}
int main()
{
fin >> n >> m;
for (int i = 1; i <= n; i++)
fin >> v[i];
build(1, 1, n);
for (int q, a, b; m; m--){
fin >> q >> a >> b;
if (!q){
sol = 0;
query(1, 1, n, a, b);
fout << sol << '\n';
}else update(1, 1, n, a, b);
}
return 0;
}