#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int V[100001],aint[400001];
void buildAint (int index, int st, int dr)
{if (st==dr)
{aint[index]=V[st];
return;
}
int mij=(st+dr)/2,fiuSt=2*index,fiuDr=2*index+1;
buildAint(fiuSt,st,mij);
buildAint(fiuDr,mij+1,dr);
aint[index]=max(aint[fiuSt],aint[fiuDr]);
}
void updateAint (int index, int st, int dr, int poz, int val)
{if (st==dr)
{aint[index]=val;
return;
}
int mij=(st+dr)/2,fiuSt=2*index,fiuDr=2*index+1;
if (poz<=mij) updateAint(fiuSt,st,mij,poz,val);
else updateAint(fiuDr,mij+1,dr,poz,val);
aint[index]=max(aint[fiuSt],aint[fiuDr]);
}
int queryAint (int index, int st, int dr, int stQ, int drQ)
{if (st==stQ && drQ==dr) return aint[index];
int mij=(st+dr)/2,fiuSt=2*index,fiuDr=2*index+1;
if (drQ<=mij) return queryAint(fiuSt,st,mij,stQ,drQ);
else if (mij+1<=stQ) return queryAint(fiuDr,mij+1,dr,stQ,drQ);
else return max(queryAint(fiuSt,st,mij,stQ,mij),queryAint(fiuDr,mij+1,dr,mij+1,drQ));
}
int main()
{int n,m;
cin>>n>>m;
for (int i=1;i<=n;i++) cin>>V[i];
buildAint(1,1,n);
for (int j=1;j<=m;j++)
{int tip,a,b;
cin>>tip>>a>>b;
if (tip==0) cout<<queryAint(1,1,n,a,b)<<'\n';
else updateAint(1,1,n,a,b);
}
return 0;
}