#include <cstdio>
using namespace std;
#define MAX_N 100001
#define INF 200000000
//int a[4*MAX_N + 70];
int arb[4*MAX_N];
int N,M,i,A,B;
int ANSWER;
int MAX (int a, int b)
{
if (a<b) return b; else return a;
}
/*
void buildtree (int ind, int li, int lf)
{
int mj;
if (li==lf) arb[ind]=a[li];
else
{
mj=(li+lf)>>1;
buildtree(ind << 1,li,mj);
buildtree((ind << 1)|1,mj+1,lf);
arb[ind]=MAX(arb[ind << 1],arb[(ind << 1)|1]);
}
}
*/
int query (int ind, int li, int lf)
{
int mj;
if (li>=A && lf<=B) return arb[ind];
if(lf<A || li>B)
return -INF;
mj=(li+lf)>>1;
return MAX( query(ind << 1,li,mj) , query((ind << 1)|1,mj+1,lf) );
}
void update(int nod, int left, int right)
{
if ( left == right )
{
arb[nod] = B;
return;
}
int div = (left+right)/2;
if ( A <= div ) update(nod << 1,left,div);
else update((nod << 1)|1,div+1,right);
arb[nod] = MAX( arb[nod << 1], arb[(nod << 1)|1] );
}
int main()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%d %d",&N,&M);
for (i=1; i<=N; i++)
{
int c;
scanf("%d",&c);
A = i;
B = c;
update (1, 1, N);
}
// buildtree(1,1,N);
for (i=1; i<=M; i++)
{
int x;
scanf("%d %d %d",&x,&A,&B);
if (!x)
{
ANSWER = query(1,1,N);
printf("%d\n",ANSWER);
}
else update (1, 1, N);
}
return 0;
}