#include <fstream>
using namespace std;
const int MaxN = 100005;
ifstream f("arbint.in");
ofstream g("arbint.out");
class Aint{
public:
void solve(){
int n, m;
f >> n >> m;
Start(n);
for(int i = 1, x; i <= n; i++){
f >> x;
Update(1, 1, n, i, x);
}
for(int t, a, b; m > 0; --m){
f >> t >> a >> b;
if(t){
Update(1, 1, n, a, b);
}
else g << Range_Query(1, 1, n, a, b) << '\n';
}
}
private:
int Max[MaxN << 2];
void Start(int n){
for(int i = 0; i <= n<<2; ++i){
Max[i] = 0;
}
}
void Update(int node, int st, int dr, int poz, int val){
if(st == dr){
Max[node] = val;
return;
}
int mij = st+dr>>1;
if(mij >= poz) Update(node<<1, st, mij, poz, val);
else Update(node<<1|1, mij+1, dr, poz, val);
Max[node] = max(Max[node<<1], Max[node<<1|1]);
}
int Range_Query(int node, int st, int dr, int a, int b){
if(a <= st && dr <= b){
return Max[node];
}
int mij = st+dr>>1, Left_Max = 0, Right_Max = 0;
if(mij >= a ) Left_Max = Range_Query(node<<1, st, mij, a, b);
if(mij < b) Right_Max = Range_Query(node<<1|1, mij+1, dr, a, b);
return max(Left_Max, Right_Max);
}
}Arbore;
int main()
{
Arbore.solve();
return 0;
}