#include <iostream>
#include <fstream>
using namespace std;
int v[1<<18];
void update(int st, int dr, int nod, int val, int pos){
if(st == dr){
v[nod] = val;
}
else{
int m = (st + dr) / 2;
if(pos <= m){
update(st, m, 2 * nod, val, pos);
}
else{
update(m + 1, dr, 2 * nod + 1, val, pos);
}
v[nod] = max(v[2 * nod], v[2 * nod + 1]);
}
}
int query(int st, int dr, int nod, int a, int b){
if(a <= st && dr <= b){
return v[nod];
}
else{
int m = (st + dr) / 2;
int m1 = -1, m2 = -1;
if(a <= m){
m1 = query(st, m, 2 * nod, a, b);
}
if(m < b){
m2 = query(m + 1, dr, 2 * nod + 1, a, b);
}
return max(m1, m2);
}
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m, cr, val;
f >> n >> m;
for(int i = 1; i <= n; i++){
f >> val;
update(1, n, 1, val, i);
}
for(int i = 1; i <= m; i++){
int a, b;
f >> cr >> a >> b;
if(cr == 0){
g << query(1, n, 1, a, b) << "\n";
}
else{
update(1, n, 1, b, a);
}
}
}