#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int tree[4*100000+5];
int n, m,val,maxi,op, a, b;
void add(int node, int left, int right, int pos, int val) {
if (left == right){
tree[node] = val;
return;
}
int mid = (left+right)/2;
if(pos <= mid){
add(2*node, left, mid, pos, val);
}else{
add(2*node+1, mid+1, right, pos, val);
}
tree[node] = max(tree[2*node], tree[2*node+1]);
}
void query(int node, int left, int right, int a, int b)
{
if(a <= left and right <= b){
maxi = max(tree[node], maxi);
return;
}
int mid = (left+right)/2;
if(a <= mid){
query(2*node, left, mid, a, b);
}
if(b > mid){
query(2*node+1, mid+1, right, a, b);
}
}
int main()
{
in >> n >> m;
for(int i=1; i<=n; i++){
in >> val;
add(1, 1, n, i, val);
}
for(int i=0; i<m; i++){
in >> op >> a >> b;
if(op == 0){
maxi = -1;
query(1, 1, n, a, b);
out << maxi << '\n';
}
if(op == 1){
add(1, 1, n, a, b);
}
}
return 0;
}