#include <stdio.h>
#define MAXN 100100
#define MAXA 300000
int v[MAXN],n,m,K,ST=0,DR=0;
int A[MAXA];
inline int max(int x, int y)
{
if (x>y)
return x;
return y;
}
void actualizare(int pozc,int st,int dr)
{
if (ST<=st && DR>=dr)
{
A[pozc]=K;
return;
}
int ma=(st+dr)/2;
if (ST<=ma)
actualizare(2*pozc,st,ma);
if (DR>ma)
actualizare(2*pozc+1,ma+1,dr);
A[pozc]=max(A[2*pozc],A[2*pozc+1]);
}
void interogare(int pozc,int st,int dr)
{
if (ST<=st && DR>=dr)
{
K=max(K,A[pozc]);
return;
}
int ma=(st+dr)/2;
if (ST<=ma)
interogare(2*pozc,st,ma);
if (DR>ma)
interogare(2*pozc+1,ma+1,dr);
}
void citire()
{
char s1[MAXN*16]; int i,j;
fgets(s1,4*16,stdin);
j=0; n=0; m=0;
while (s1[j]>='0' && s1[j]<='9')
n=n*10+s1[j++]-'0';
j++;
while (s1[j]>='0' && s1[j]<='9')
m=m*10+s1[j++]-'0';
fgets(s1,16*MAXN,stdin);
for (i=0,j=0; i<n; i++,j++)
{
K=0;
while (s1[j]>='0' && s1[j]<='9')
K=K*10+s1[j++]-'0';
v[i]=K; ST=DR=i;
actualizare(1,0,n-1);
}
}
void rezolvare()
{
char s1[4*16];
int t,a,b,i,j;
for (i=0; i<m; i++)
{
fgets(s1,4*16,stdin);
j=0; t=0; a=0; b=0;
while (s1[j]>='0' && s1[j]<='9')
t=t*10+s1[j++]-'0';
j++;
while (s1[j]>='0' && s1[j]<='9')
a=a*10+s1[j++]-'0';
j++;
while (s1[j]>='0' && s1[j]<='9')
b=b*10+s1[j++]-'0';
if (t==1)
{
K=b; a--; ST=DR=a;
actualizare(1,0,n-1);
}
if (t==0)
{
a--; b--; ST=a; DR=b; K=0;
interogare(1,0,n-1);
printf("%d\n",K);
}
}
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
citire();
rezolvare();
fclose(stdin);
fclose(stdout);
return 0;
}