#include<bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
void AINT(long long node, long long left, long long right, vector<long long> &a, vector<long long> &segment_tree){
if(left == right){
segment_tree[node] = a[left];
}
else{
long long mid = (left + right) / 2;
AINT(2 * node, left, mid, a, segment_tree);
AINT(2 * node + 1, mid + 1, right, a, segment_tree);
segment_tree[node] = max(segment_tree[2 * node], segment_tree[2 * node + 1]);
}
}
long long parcurgere(long long node, long long left, long long right, long long left_cautare, long long right_cautare, vector<long long> &segment_tree){
if(left == left_cautare && right == right_cautare){
return segment_tree[node];
}
long long mid = (left + right) / 2;
if(mid + 1 <= left_cautare){
return parcurgere(2 * node + 1, mid + 1, right, left_cautare, right_cautare, segment_tree);
}
else{
if(mid + 1 > right_cautare){
return parcurgere(2 * node, left, mid, left_cautare, right_cautare, segment_tree);
}
else{
return max(parcurgere(2 * node, left, mid, left_cautare, mid, segment_tree), parcurgere(2 * node + 1, mid + 1, right, mid + 1, right_cautare, segment_tree));
}
}
}
void finding(long long node, vector<long long> &segment_tree){
if(segment_tree[node] == max(segment_tree[2 * node], segment_tree[2 * node + 1])){
return;
}
else{
segment_tree[node] = max(segment_tree[2 * node], segment_tree[2 * node]);
if(node == 1){
return;
}
else{
finding(node / 2, segment_tree);
}
}
}
void update(long long node, long long left, long long right, long long pos, long long val, vector<long long> &segment_tree){
if(left == pos && right == pos){
segment_tree[node] = val;
finding(node, segment_tree);
}
else{
long long mid = (left + right) / 2;
if(mid + 1 <= pos){
update(2 * node + 1, mid + 1, right, pos, val, segment_tree);
}
else{
update(2 * node, left, mid, pos, val, segment_tree);
}
}
}
int main(){
//cin.tie(nullptr)->sync_with_stdio(false);
long long n, m;
fin >> n >> m;
vector<long long> a(n + 1);
for(long long i = 1; i <= n; i++){
fin >> a[i];
}
vector<long long> segment_tree(4 * n + 5, -1);
AINT(1, 1, n, a, segment_tree);
//pana aici a fost creat arborele de long longervale
for(long long i = 0; i < m; i++){
long long value, left, right;
fin >> value >> left >> right;
if(value == 0){
fout << parcurgere(1, 1, n, left, right, segment_tree) << '\n';
}
else{
update(1, 1, n, left, right, segment_tree);
}
}
return 0;
}