#include<stdio.h>
#define MaxN 2000000
#define lf (2 * nod)
#define rf (2 * nod) + 1
#define mij (st + dr) / 2
int AI[MaxN];
int A[100100];
int N;
int M;
int stare;
int a;
int b;
inline int max(int a,int b)
{
return a>b ? a:b;
}
int build(int nod,int st,int dr)
{
if(st == dr)
AI[nod] = A[st];
else
AI[nod] = max(build(lf,st,mij),build(rf , mij+1 , dr));
return AI[nod];
}
int update(int nod,int st,int dr,int t,int v)
{
if(st == dr)
AI[nod] = v;
if(st < dr && st <= t && t <= dr)
{
if(t <= mij)
{
update(lf , st , mij , t , v);
AI[nod] = max(AI[rf],AI[lf]);
}
else
{
update(rf , mij + 1 , dr , t , v);
AI[nod] = max(AI[rf],AI[lf]);
}
}
}
int querry(int nod,int st,int dr,int a,int b)
{
int sum = 0;
if(a <= st && dr <= b)
return AI[nod];
if(a <= mij)
sum = max(sum , querry(lf , st , mij , a , b));
if(mij < b)
sum = max(sum , querry(rf , mij + 1 , dr , a , b));
return sum;
}
int main()
{
FILE *f = fopen("arbint.in","r");
FILE *g = fopen("arbint.out","w");
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=N;i++)
fscanf(f,"%d ",&A[i]);
build(1,1,N);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d %d",&stare,&a,&b);
if(!stare)
fprintf(g,"%d \n",querry(1,1,N,a,b));
else
update(1,1,N,a,b);
}
fclose(g);
fclose(f);
return 0;
}