#include <fstream>
#include <iostream>
#include <vector>
std::ifstream in;
std::ofstream out;
class AINT{
std::vector<int> v;
int maxx;
public:
AINT(){
v.resize(400005);
maxx = -1;
}
void update(int, int, int, int, int);
void query(int, int, int, int, int);
void resetMax(){
maxx = -1;
}
int getMax(){
return maxx;
}
};
void AINT::update(int node, int left, int right, int pos, int x) {
if(left == right){
v[node] = x;
return;
}
else{
int mid = (left + right) / 2;
if(pos <= mid){
update(2*node, left, mid, pos, x);
}
else{
update(2*node + 1, mid + 1, right, pos, x);
}
v[node] = std::max(v[2*node], v[2*node+1]);
}
}
void AINT::query(int node, int left, int right, int a, int b) {
if(a<=left and right<=b){
if(v[node] > maxx)
maxx = v[node];
return;
}
else{
int mid = (left + right) / 2;
if(a <= mid)
return query(2*node, left, mid, a, b);
if(b >= mid)
return query(2*node + 1, mid + 1, right, a ,b);
}
}
int main() {
int n, i , m, op, a, b, x;
in.open("arbint.in");
in>>n>>m;
AINT aint;
for(i=0;i<n;i++){
in>>x;
aint.update(1, 1, n, i + 1 , x);
}
out.open("arbint.out");
for(i = 0; i < m; i++){
in>>op>>a>>b;
if(op == 0){
aint.resetMax();
aint.query(1,1,n,a,b);
out<<aint.getMax() << '\n';
}
else{
aint.update(1,1,n,a,b);
}
}
in.close();
out.close();
return 0;
}