#include <fstream>
#include <vector>
class SegmentTree{
private:
std::vector<int> tree;
int n;
public:
SegmentTree(int n)
{
tree=std::vector<int> (4*n+1);
this->n=n;
}
void update(int x,int left,int right,int pos,int val)// the value of the element on position pos becomes val
{
if(left==right)
tree[x]=val;
else{
int mid=(left+right)/2;
if(pos<=mid)
update(2*x,left,mid,pos,val);
if(pos>mid)
update(2*x+1,mid+1,right,pos,val);
tree[x]=std::max(tree[2*x],tree[2*x+1]);
}
}
int get_max(int x,int left,int right,int a, int b)//returns the max value from interval [left,right]
{
if(a<=left && b>=right)// [a,b] is in [left,right]
return tree[x];
else{
int mid=(left+right)/2,sol=-999999999;
if(a<=mid)
sol=std::max(sol,get_max(2*x,left,mid,a,b));
if(b>mid)
sol=std::max(sol,get_max(2*x+1,mid+1,right,a,b));
return sol;
}
}
};
int main()
{
int n,m;
std::ifstream in("arbint.in");
in>>n>>m;
SegmentTree tree(n);
for(int i=0;i<n;i++)
{
int x;
in>>x;
tree.update(1,0,n-1,i,x);
}
std::ofstream out("arbint.out");
for(;m;m--)
{
int t,a,b;
in>>t>>a>>b;
if(t==1)//1 for update
tree.update(1,0,n-1,a-1,b);
if(t==0)//0 for query
out<<tree.get_max(1,0,n-1,a-1,b-1)<<'\n';
}
in.close();
out.close();
return 0;
}