#include<fstream>
#include<iostream>
#define dim 100001
#define maxim(x,y) (x)>(y)?(x):(y)
long arb[dim*3],jum,max;
void update(long nod,long st, long dr, long poz, long val)
{if(st==dr) arb[nod]=val;
else
{
jum=(st+dr)/2;
if(poz<=jum) update(nod*2,st,jum,poz,val);
else update(nod*2+1,jum+1,dr,poz,val);
arb[nod]=maxim(arb[nod*2],arb[nod*2+1]);
}
}
void query(long nod, long st, long dr, long a, long b)
{
if((a<=st)&&(b>=dr))
{
if(max<arb[nod]) max=arb[nod];
}
else
{
if(a<=((st+dr)/2)) query(nod*2,st,(st+dr)/2,a,b);
if(b>((st+dr)/2)) query(nod*2+1,((st+dr)/2)+1,dr,a,b);
}
}
int main()
{
std::ifstream f("arbint.in");
std::ofstream g("arbint.out");
long n,m,i,a,b,x;
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
update(1,1,n,i,x);
}
for(i=1;i<=m;i++)
{
f>>x>>a>>b;
if(x==0)
{
max=0;
query(1,1,n,a,b);
g<<max<<'\n';
}
else update(1,1,n,a,b);
}
return 0;
}