#include <bits/stdc++.h>
#define LeftSon(x) (x*2)
#define RightSon(x) (x*2+1)
#define mid(x,y) ((x+y)/2)
using namespace std;
ifstream fin("aint.in");
ofstream fout("aint.out");
int aint[200005],v[100005];
int n,m;
int ans;
void Build(int left,int right,int node)
{
if(left==right)
{
aint[node]=v[left];
return;
}
Build(left,mid(left,right),LeftSon(node));
Build(mid(left,right)+1,right,RightSon(node));
aint[node]=max(aint[RightSon(node)],aint[LeftSon(node)]);
}
void Update(int left,int right,int node,int &poz,int &val)
{
if(left==right)
{
aint[node]=val;
v[poz]=val;
return;
}
if(poz<=mid(left,right))
Update(left,mid(left,right),LeftSon(node),poz,val);
else
Update(mid(left,right)+1,right,RightSon(node),poz,val);
aint[node]=max(aint[RightSon(node)],aint[LeftSon(node)]);
}
void Query(int left,int right,int node,int &Left,int &Right)
{
if(left>=Left&&right<=Right)
{
ans=max(ans,aint[node]);
return;
}
if(Left<=mid(left,right))
Query(left,mid(left,right),LeftSon(node),Left,Right);
else
Query(mid(left,right)+1,right,RightSon(node),Left,Right);
}
int main()
{
int obt,a,b;
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>v[i];
Build(1,n,1);
for(int i=1;i<=m;i++)
{
fin>>obt>>a>>b;
switch(obt)
{
case 0:
ans=-2e9;
Query(1,n,1,a,b);
fout<<ans<<"\n";
break;
case 1:
Update(1,n,1,a,b);
break;
}
}
return 0;
}