#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int aint[2000001];
int arr[2000001];
int n_nodes, n_query;
void build(int node, int left, int right){
if(left == right)
aint[node] = arr[left];
else{
int mid = (left+right)/2;
build(node*2, left, mid);
build(node*2 + 1, mid + 1, right);
aint[node] = max(aint[node*2], aint[node*2 + 1]);
}
}
void update(int node, int left, int right, int pos, int val_new){
if(left == right)
aint[node] = val_new;
else{
int mid = (left+right)/2;
if(pos <= mid)
update(node*2, left, mid, pos, val_new);
if(pos > mid)
update(node*2 + 1, mid + 1, right, pos, val_new);
aint[node] = max(aint[node*2], aint[node*2+1]);
}
}
int query(int node, int left, int right, int query_left, int query_right){
if(query_left <= left && right <= query_right)
return aint[node];
else{
int mid = (left + right) / 2;
if(mid >= query_right)
return query(node*2, left, mid, query_left, query_right);
if(mid + 1 <= query_left)
return query(node*2 + 1, mid + 1, right, query_left, query_right);
return max(query(node*2, left, mid, query_left, query_right), query(node*2 + 1, mid + 1, right, query_left, query_right));
}
}
int main()
{
fin>>n_nodes>>n_query;
int x,y,z;
for(int i = 1; i<=n_nodes; i++){
fin>>x;
arr[i] = x;
}
build(1,1,n_nodes);
for(int i = 1; i<=n_query; i++){
fin>>x>>y>>z;
//cout<<x<<' '<<y<<' '<<z<<endl;
if(x)
update(1, 1, n_nodes, y, z);
else
fout<<query(1, 1, n_nodes, y, z)<<'\n';
}
return 0;
}