#include <bits/stdc++.h>
#define RSon(x) (x*2+1)
#define LSon(x) (x*2)
using namespace std;
ifstream fin("aint.in");
ofstream fout("aint.out");
int aint[200005],v[100005], n, m, maxim;
void Build(int node,int left,int right)
{
if(left==right)
{
aint[node]=v[left];
return;
}
int m=(left+right)/2;
Build(LSon(node),left,m);
Build(RSon(node),m+1,right);
aint[node]=max(aint[LSon(node)],aint[RSon(node)]);
}
void Update(int node,int left,int right,const int &poz,const int &val)
{
if(left==right)
{
aint[node]=val;
v[poz]=val;
return;
}
int m=(left+right)/2;
if(poz<=m)
Update(LSon(node),left,m,poz,val);
else Update(RSon(node),m+1,right,poz,val);
aint[node]=max(aint[LSon(node)],aint[RSon(node)]);
}
void Query(int node, int left, int right,const int &LeftQ,const int &RightQ)
{
if(LeftQ<=left && right<=RightQ)
{
maxim=max(maxim,aint[node]);
return;
}
int m=(left+right)/2;
if(LeftQ <= m)
Query(LSon(node), left, m, LeftQ, RightQ);
if(m+1 <= RightQ)
Query(RSon(node), m+1, right, LeftQ, RightQ);
}
int main()
{
int obt,a,b;
fin>>n>>m;
for(int i=1;i<=n;i++)
fin>>v[i];
Build(1,1,n);
for(int i=1;i<=n;i++)
{
fin>>obt>>a>>b;
if(obt==0)
{
maxim=-1e9;
Query(1,1,n,a,b);
fout<<maxim<<"\n";
}
else
Update(1,1,n,a,b);
}
return 0;
}