#include<fstream>
const int lg=100005;
int init[lg],t[4*lg],a,b,rez;
inline int max(int a, int b)
{
return a>b?a:b;
}
//construire arbore
void construiesc(int st, int dr, int poz)
{
if(st==dr)
{
init[st]=poz;
return;
}
int x=(st+dr)/2;
construiesc(st,x,2*poz);
construiesc(x+1,dr,2*poz+1);
}
//***Actualizare***
void actualizez(int poz, int val)
{
int x=init[poz];
t[x]=val;
x>>=1;
while(x)
{
t[x]=max(t[2*x],t[2*x+1]);
x>>=1;
}
}
//***Interogare***
void interogare(int st, int dr, int poz)
{
if(st>b || dr<a) return;
if( a<=st&& dr<=b )
rez=max(rez,t[poz]);
else
if(st<dr)
{
int x=(st+dr)/2;
interogare(st, x,poz*2);
interogare(x+1,dr,poz*2+1);
}
}
int main()
{
int i,x,n,m;
freopen ("arbint.in","r",stdin);
freopen ("arbint.out","w",stdout);
scanf("%d %d",&n,&m);
construiesc(1,n,1);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
actualizez(i,x);
}
for(i=1;i<=m;i++)
{
scanf("%d %d %d",&x,&a,&b);
if(!x)
{
rez=0;
interogare(1,n,1);
printf("%d\n",rez);
}
else
actualizez(a,b);
}
return 0;
}