#include <bits/stdc++.h>
#pragma GCC optimize ("Ofast")
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
const int MAX_N = 100005;
int n, input[MAX_N];
struct SEGTREE{
int aint[4 * MAX_N];
inline void build(int nod, int st, int dr){
int md = st + ((dr - st) >> 1);
if(st == dr){
aint[nod] = input[md];
return;
}
build(2*nod , st , md);
build(2*nod+1, md+1, dr);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
inline void update(int nod, int st, int dr, int index, int new_val){
int md = st + ((dr - st) >> 1);
if(st == dr){
aint[nod] = new_val;
return;
}
if(index <= md)
update(2*nod , st , md, index, new_val);
else
update(2*nod+1, md+1, dr, index, new_val);
aint[nod] = max(aint[2*nod], aint[2*nod+1]);
}
int sol;
inline void query(int nod, int st, int dr, int lft, int rgt){
if(lft <= st && dr <= rgt){
sol = max(sol, aint[nod]);
return;
}
int md = st + ((dr - st) >> 1);
if(lft <= md) query(2*nod , st , md, lft, rgt);
if(rgt > md) query(2*nod+1, md+1, dr, lft, rgt);
}
} tree;
const int MAX_Q = 100005;
int qcnt, type, a, b;
int main (){
ios_base::sync_with_stdio(false);
fin.tie(nullptr), fout.tie(nullptr);
fin>>n>>qcnt;
for(int i=1; i<=n; i++)
fin>>input[i];
tree.build(1, 1, n);
while(qcnt--){
fin>>type>>a>>b;
if(type == 0){ ///query
tree.sol = 0;
tree.query(1, 1, n, a, b);
fout<<tree.sol<<"\n";
}else{ ///update
tree.update(1, 1, n, a, b);
}
}
return 0;
}