#include <bits/stdc++.h>
#define ll long long
#define INF 0x3F3F3F3F
using namespace std;
const string fisier = "arbint";
ifstream fin (fisier + ".in");
ofstream fout (fisier + ".out");
const int N_MAX = 1e6 + 5;
int a[N_MAX] , n , m , ans;
int left_son (int node){
return 2 * node;
}
int right_son (int node){
return 2 * node + 1;
}
void update(int node, int st, int dr, int poz, int val){
if (st == dr){
a[node] = val;
return;
}
int mij = (st + dr) / 2;
if (poz <= mij){
update(left_son(node) , st , mij , poz , val);
}
else{
update(right_son(node) , mij + 1 , dr , poz , val);
}
a[node] = max(a[left_son(node)] , a[right_son(node)]);
}
void query (int node , int st , int dr , int Qst , int Qdr){
if (Qst <= st && Qdr >= dr){
ans = max(ans , a[node]);
return;
}
int mij = (st + dr) / 2;
if (Qst <= mij){
query(left_son(node) , st , mij , Qst , Qdr);
}
else{
query(right_son(node) , mij + 1 , dr , Qst , Qdr);
}
}
int main(){
ios_base::sync_with_stdio(false);
fin >> n >> m;
for (int i=1; i<=n; i++){
int x; fin >> x;
update(1 , 1 , n , i , x);
}
for (int i=1; i<=m; i++){
int op , x , y; fin >> op >> x >> y;
if (op == 1){
update(1 , 1 , n , x , y);
}
else{
ans = 0;
query(1 , 1 , n , x , y);
fout << ans << '\n';
}
}
}