#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100005;
int aint[NMAX * 2],v[NMAX];
void build(int node,int left,int right)
{
if(left == right)
{
aint[node] = v[left];
return;
}
int mid = left + (right - left) / 2;
build(node * 2, left, mid);
build(node * 2 + 1,mid + 1,right);
aint[node] = max(aint[2 * node + 1],aint[2 * node]);
}
void update(int node, int left, int right, int poz, int val){
if(left == right){
aint[node] = val;
return;
}
int mid = left + (right - left) / 2;
if(poz <= mid)
update(node * 2,left, mid, poz, val);
else
update(node * 2 + 1,mid + 1,right,poz,val);
aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}
int query(int node, int left, int right, int leftq, int rightq){
if(leftq <= left && right <= rightq){
return aint[node];
}
int mid = left + (right - left) / 2,ans1,ans2;
ans1 = ans2 = 0;
if(leftq <= mid)
ans1 = query(node * 2, left, mid, leftq,rightq);
else
ans2 = query(node * 2 + 1, mid + 1, right, leftq, rightq);
return max(ans1,ans2);
}
int main()
{
int n,m;
fin>>n>>m;
for(int i = 1;i <= n;i++)
fin>>v[i];
build(1,1,n);
int q,x,y;
for(int i = 1; i <= m;i++){
fin>>q>>x>>y;
if(q == 0)
fout<<query(1,1,n,x,y)<<"\n";
else
update(1,1,n,x,y);
}
}
/*
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100005;
int v[NMAX],aint[2 * NMAX];
void build(int node,int left,int right){
if(left == right){
aint[node] = v[left];
return;
}
int mid = left + (right - left) / 2;
build(2 * node,left, mid);
build(2 * node,mid + 1,right);
aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}
void update(int node, int left, int right, int poz, int val){
if(left == right){
aint[node] = val;
return;
}
int mid = left + (right - left) / 2;
if(poz <= mid)
update(node * 2,left,mid,poz,val);
else
update(node * 2 + 1,mid + 1,right,poz,val);
aint[node] = max(aint[2 * node],aint[2 * node + 1]);
}
int query(int node,int left,int right, int leftq,int rightq)
{
if(leftq <= left && right <= rightq){
return aint[node];
}
int mid = left + (right - left) / 2,ans1 = 0,ans2 = 0;
if(leftq <= mid)
ans1 = query(2* node, left, mid,leftq,rightq);
else
ans2 = query(2 * node + 1,mid + 1,right,leftq,rightq);
return max(ans1,ans2);
}
int main()
{
int n,m;
fin>>n>>m;
for(int i = 1;i <= n;i++)
fin>>v[NMAX];
build(1,1,n);
int q,x,y;
for(int i = 1;i <= m;i++){
fin>>q>>x>>y;
if(q == 0)
fout<<query(1,1,n,x,y)<<"\n";
else
update(1,1,n,x,y);
}
return 0;
}
*/