# include <cstdio>
# include <algorithm>
using namespace std;
FILE *f = freopen("arbint.in", "r", stdin);
FILE *g = freopen("arbint.out", "w", stdout);
const int N_MAX = 100010;
const int ARB_MAX = 4 * N_MAX;
int n, m;
int maxim;
int v[N_MAX];
int arb[ARB_MAX];
void answer_query(int nod, int left, int right, int query_left, int query_right){
if (query_left <= left && right <= query_right){
maxim = max(maxim, arb[nod]);
}
else{
int mid = (left + right) / 2;
int left_son = nod << 1;
int right_son = left_son + 1;
if (mid >= query_left)
answer_query(left_son, left, mid, query_left, query_right);
if (mid < query_right)
answer_query(right_son, mid+1, right, query_left, query_right);
}
}
void update(int nod, int left, int right, int poz, int val){
if (left == right){
arb[nod] = val;
}
else{
int mid = (left + right) / 2;
int left_son = nod << 1;
int right_son = left_son + 1;
if (poz <= mid)
update(left_son, left, mid, poz, val);
else
update(right_son, mid+1, right, poz, val);
arb[nod] = max(arb[left_son], arb[right_son]);
}
}
void solve(){
for (int i=1; i<=m; i++){
int t, x, y;
scanf("%d %d %d", &t, &x, &y);
if (t == 0){
maxim = -1e9;
answer_query(1, 1, n, x, y);
printf("%d\n", maxim);
}
else{
v[x] = y;
update(1, 1, n, x, y);
}
}
}
void read(){
scanf("%d %d", &n, &m);
for (int i=1; i<=n; i++){
scanf("%d", &v[i]);
update(1, 1, n, i, v[i]);
}
}
int main(){
read();
solve();
return 0;
}