#include <fstream>
using namespace std;
const int nmax = 100005;
int arbi[4 * nmax];
int v[nmax];
void build(int nod, int st, int dr){
if(st == dr){
arbi[nod] = v[st];
return;
}
int mid = (st + dr) / 2;
build(2 * nod, st, mid);
build(2 * nod + 1, mid + 1, dr);
arbi[nod] = max(arbi[2 * nod], arbi[2 * nod + 1]);
}
void update(int nod, int st, int dr, int x, int y){
if(st == dr){
arbi[nod] = y;
return;
}
int mid = (st + dr) / 2;
if(x <= mid){
update(2 * nod, st, mid, x, y);
}
else{
update(2 * nod + 1, mid + 1, dr, x, y);
}
arbi[nod] = max(arbi[2 * nod], arbi[2 * nod + 1]);
}
int query(int nod, int st, int dr, int x, int y){
if(st == x && dr == y){
return arbi[nod];
}
int mid = (st + st) / 2;
if(y <= mid){
return query(2 * nod, st, mid, x, y);
}
else if(x > mid){
return query(2 * nod + 1, mid + 1, dr, x, y);
}
else{
return max(query(2 * nod, st, mid, x, y), query(2 * nod + 1, mid + 1, dr, x, y));
}
}
int main(){
ifstream f("arbint.in");
ofstream g("arbint.out");
int n, m;
f >> n >> m;
for(int i = 1; i <= n; i++){
f >> v[i];
}
build(1, 1, n);
for(int i = 1; i <= 2 * n; i++){
g << arbi[i] << ' ';
}
while(m--){
int t, x, y;
f >> t >> x >> y;
if(t == 0){
g << query(1, 1, n, x, y) << '\n';
}
if(t == 1){
update(1, 1, n, x, y);
}
}
return 0;
}