#include <fstream>
#include <algorithm>
#define nmax 400010
using namespace std;
int N,M,n,arb[nmax];
inline void Update(int p,int x)
{
int k,y;
arb[p]=x;
while(p>1)
{
k=p/2;
y=max(arb[2*k], arb[2*k+1]);
if(y!=arb[k])
arb[k]=y;
else
return ;
p=k;
}
}
inline int Query(int nod, int x,int y,int st,int dr)
{
int m;
if(x==st && y==dr)
return arb[nod];
m=(st+dr)/2;
if(y<=m)
return Query(nod*2,x,y,st,m);
else
if(x>m)
return Query(nod*2+1,x,y,m+1,dr);
else
return max(Query(nod*2,x,m,st,m), Query(nod*2+1,m+1,y,m+1,dr));
}
int main()
{
int i,tip,x,y;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
fin>>N>>M;
for(n=1;n<N;n<<=1);
for(i=n;i<n+N;++i)
fin>>arb[i];
for(i=n-1;i>0;--i)
arb[i]=max(arb[i*2], arb[i*2+1]);
while(M--)
{
fin>>tip>>x>>y;
if(!tip)
fout<<Query(1,x,y,1,n)<<"\n";
else
Update(n-1+x,y);
}
fin.close();
fout.close();
return 0;
}