#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int v[100003], A[400003];
void update(int nod, int l, int r, int poz, int val){
if(l == r){
A[nod] = val;
}
else{
int mij = (l + r) / 2;
int nodSt = 2 * nod, nodDr = 2 * nod + 1;
if(poz <= mij){
update(nodSt, l, mij, poz, val);
}
else{
update(nodDr, mij + 1, r, poz, val);
}
A[nod] = max(A[nodSt], A[nodDr]);
}
}
void build(int nod, int l, int r){
if(l == r){
A[nod] = v[l];
}
else{
int mij = (l + r) / 2;
int nodSt = 2 * nod, nodDr = 2 * nod + 1;
build(nodSt, l, mij);
build(nodDr, mij + 1, r);
A[nod] = max(A[nodSt], A[nodDr]);
}
}
int query(int nod, int l, int r, int ql, int qr){
if(l >= ql && r <= qr){
return A[nod];
}
else{
int mij = (l + r) / 2;
int nodSt = 2 * nod, nodDr = 2 * nod + 1;
int rez1 = -1, rez2 = -1;
if(ql <= mij){
rez1 = query(nodSt, l, mij, ql, qr);
}
if(qr > mij){
rez2 = query(nodDr, mij + 1, r, ql, qr);
}
return max(rez1, rez2);
}
}
int main()
{
int n, m;
fin >> n >> m;
for(int i=1; i<=n; i++){
fin >> v[i];
}
build(1, 1, n);
for(int c, a, b, i=1; i<=m; i++){
fin >> c >> a >> b;
if(c == 0){
fout << query(1, 1, n, a, b) << '\n';
}
else{
update(1, 1, n, a, b);
}
}
return 0;
}