#include <stdio.h>
#define NM (1<<18)
#define md (l+r>>1)
#define ls (n<<1)
#define rs (n<<1|1)
#define max(a,b) ((a)>(b)?(a):(b))
FILE *f,*g;
long rez,a,b;
long arb[NM];
void query (int n, int l, int r)
{
if (a<=l && r<=b)
{
rez=max(rez,arb[n]);
return;
}
if (a<=md)
query(ls,l,md);
if (md+1<=b)
query(rs,md+1,r);
}
void update (int n,int l,int r)
{
if (l==r)
arb[n]=b;
else
{
if (a<=md)
update(ls,l,md);
else
update(rs,md+1,r);
arb[n]= max (arb[ls],arb[rs]);
}
}
int main()
{int x,i; long n,m;
freopen("arbint.in","rt",stdin);
freopen("arbint.out","wt",stdout);
scanf("%ld %ld\n",&n,&m);
for (i=1;i<=n;i++)
{
scanf ("%ld",&b);
a=i; update (1,1,n);
}
while(m--)
{
scanf ("%d %ld %ld\n",&x,&a,&b);
if (x==1) update(1,1,n);
else
{
rez=-1;
query(1,1,n);
printf("%ld\n",rez);
}
}
return 0;
}