#include <stdio.h>
#define NM 100001
long arb[4*NM+100];
long m,n;
long query(long st,long dr,long x,long y,long nod );
void update(long st,long dr,long poz,long a,long nod);
int main()
{ freopen("arbint.in","rt",stdin);
freopen("arbint.out","wt",stdout);
scanf("%ld %ld",&n,&m);
long i,x,a,b,max;
for (i=1;i<=n;i++)
{ scanf("%ld",&x);
update(1,n,i,x,1);
}
for (i=1;i<=m;i++)
{ scanf("%ld %ld %ld",&x,&a,&b);
if (x==0)
{ max=query(1,n,a,b,1);
printf("%ld\n",max);
}
else update(1,n,a,b,1);
}
return 0;
}
long query(long st,long dr,long x,long y,long nod)
{ if (st>y||dr<x) return -1;
if (x<=st&&dr<=y) return arb[nod];
long mij=(st+dr)/2,x1=-1,x2=-1;
x1=query(st,mij,x,y,2*nod);
x2=query(mij+1,dr,x,y,2*nod+1);
return (x1>x2?x1:x2);
}
void update(long st,long dr,long poz,long a,long nod)
{ if (st==dr)
{ arb[nod]=a;
return;
}
long mij=(st+dr)/2;
if (poz<=mij) update(st,mij,poz,a,2*nod);
else update(mij+1,dr,poz,a,2*nod+1);
arb[nod]=(arb[2*nod]>arb[2*nod+1]?arb[2*nod]:arb[2*nod+1]);
}