#include <cstdio>
#include <algorithm>
using namespace std;
int n, m;
int sirx[100004];
struct Arbore{
int sir[400004];
int insertInitial(int poz, int st, int dr){
if(st == dr){
sir[poz] = sirx[st];
return sir[poz];
}
else{
int m = (st + dr) / 2;
sir[poz] = max(insertInitial(poz * 2, st, m), insertInitial(poz * 2 + 1, m + 1, dr));
return sir[poz];
}
}
void insertx(int poz, int st, int dr, int val, int pozx){
if(st == dr){
sir[poz] = val;
}
else{
int m = (st + dr) / 2;
int valx;
if(m >= pozx){
insertx(poz * 2, st, m, val, pozx);
valx = sir[poz * 2 + 1];
}
else{
insertx(poz * 2 + 1, m + 1, dr, val, pozx);
valx = sir[poz * 2];
}
sir[poz] = max(valx, val);
}
}
int querry(int poz, int st, int dr, int stx, int drx){
if(st >= stx && dr <= drx){
return sir[poz];
}
int m = (st + dr) / 2;
int val = 0;
if(m >= stx){
val = max(val, querry(poz * 2, st, m, stx, drx));
}
if(m < drx){
val = max(val, querry(poz * 2 + 1, m + 1, dr, stx, drx));
}
return val;
}
Arbore(){
insertInitial(1, 1, n);
}
};
void citire(){
scanf("%d %d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%d", &sirx[i]);
}
}
int main()
{
freopen("arbint.in", "r", stdin);
freopen("arbint.out", "w", stdout);
citire();
Arbore arbore;
int x, y, z;
for(int k = 0; k < m; k++){
scanf("%d %d %d", &x, &y, &z);
if(x == 0){
printf("%d\n", arbore.querry(1, 1, n, y, z));
}
else if(x == 1){
arbore.insertx(1, 1, n, z, y);
}
}
return 0;
}