#include <cstdio>
const int Q=100000+1;
int v[Q],pozarb[Q];
int arb[1<<18];
int max(int a, int b)
{
return a>b ? a : b;
}
int make_arb(int val,int st, int dr)
{
if(st!=dr)
{
arb[val]=max( make_arb(2*val,st,(dr+st)/2), make_arb(2*val+1,(st+dr)/2+1,dr));
}
else
{
pozarb[st]=val;
arb[val]=v[st];
}
return arb[val];
}
void modif_arb(int poz)
{
arb[poz]=max(arb[2*poz],arb[2*poz+1]);
if(poz/2!=0)
modif_arb(poz/2);
}
int find_max(int poz,int s, int d,int st,int dr)
{
if(s>=st && d<=dr)
return arb[poz];
if(st>d || dr<s)
return 0;
return max(find_max(poz*2,s,(s+d)/2,st,dr),find_max(poz*2+1,(s+d)/2+1,d,st,dr));
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
int n,h;
scanf("%d%d",&n,&h);
for(int i=1; i<=n; i++)
{
scanf("%d",&v[i]);
}
int x;
x=make_arb(1,1,n);
int t,a,b;
for(int i=1; i<=h; i++)
{
scanf("%d%d%d",&t,&a,&b);
if(t==1)
{
v[a]=b;
arb[pozarb[a]]=b;
modif_arb(pozarb[a]/2);
}
else
{
printf("%d\n",find_max(1,1,n,a,b));
}
}
return 0;
}