#include <iostream>
#include<fstream>
#include<algorithm>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int N = 101000;
struct no {
int f1, f2, val;
};
int n, m, x[N], nodc, rad[N];
no a[N * 100];
void update(int &nod, int pozx, int pozy, int poz, int val) {
a[++nodc] = a[nod];
nod = nodc;
if(pozx == pozy) {
a[nod].val = val;
return;
}
int mid = (pozx + pozy) / 2;
if(mid >= poz)
update(a[nod].f1, pozx, mid, poz, val);
else
update(a[nod].f2, mid + 1, pozy, poz, val);
a[nod].val = max(a[a[nod].f1].val, a[a[nod].f2].val);
}
int query(int nod, int pozx, int pozy, int poz1, int poz2) {
if(poz1 <= pozx && pozy <= poz2) {
return a[nod].val;
}
int mid = (pozx + pozy) / 2, rez = 0;
if(mid >= poz1)
rez = query(a[nod].f1, pozx, mid, poz1, poz2);
if(mid < poz2)
rez = max(rez, query(a[nod].f2, mid + 1, pozy, poz1, poz2));
return rez;
}
int main()
{
int i, j;
in >> n >> m;
for(i = 1; i <= n; ++i) {
in >> x[i];
update(rad[1], 1, n, i, x[i]);
}
int last = 1;
for(i = 2; i <= m + 1; ++i) {
int op, aa, aaa;
in >> op >> aa >> aaa;
if(!op) {
out << query(rad[1], 1, n, aa, aaa) << "\n";
}
else {
rad[1] = rad[1];
last = i;
update(rad[1], 1, n, aa, aaa);
}
}
return 0;
}