#include <bits/stdc++.h>
using namespace std;
int arbint[400005], a[100005];
void build(int nod, int st, int dr){
if(st == dr){
arbint[nod] = a[st];
}else{
int mid = (st + dr) / 2;
build(nod * 2, st, mid);
build(2 * nod+1, mid+1, dr);
arbint[nod] = max(arbint[nod * 2], arbint[2 * nod +1]);
}
}
int maxim;
void query(int nod, int st, int dr, int l, int r){
if(l <= st && dr <= r){
maxim = max(maxim, arbint[nod]);
}else{
int mid = (st + dr) / 2;
if(l <= mid){
query(2 * nod,st,mid, l, r);
}
if(r > mid){
query(2 * nod + 1,mid+1,dr,l,r);
}
}
}
void update(int nod, int st, int dr, int poz, int x){
if(st == dr){
arbint[nod] = x;
}else{
int mid = (st + dr) / 2;
if(poz <= mid){
update(nod * 2, st, mid, poz, x);
}else{
update(2 * nod + 1, mid+1,dr, poz ,x);
}
arbint[nod] = max(arbint[2 * nod + 1], arbint[nod * 2]);
}
}
int main(void){
ofstream cout("arbint.out");
ifstream cin("arbint.in");
int n,Q;
cin >> n >> Q;
for(int i = 1;i<=n;i++){
cin >> a[i];
}
build(1,1,n);
while(Q--){
int p, l, r;
cin >> p >> l >> r;
if(p == 0){
maxim = 0;
query(1,1,n,l,r);
a[l] = r;
cout << maxim << '\n';
}else{
update(1,1,n,l,r);
}
}
}