#include<stdio.h>
FILE *f = fopen("arbint.in","r");
FILE *g = fopen("arbint.out","w");
#define MaxN 100100
#define mij ((li+ls)>>1)
#define fs (poz<<1)
#define fd ((poz<<1)+1)
int N,M;
int A[MaxN],AINT[4*MaxN];
void citire(void)
{
fscanf(f,"%d %d",&N,&M);
for(int i=1;i<=N;i++)
fscanf(f,"%d ",&A[i]);
}
inline int max(int a,int b)
{
return a > b ? a : b;
}
inline void build(int li,int ls,int poz)
{
if(li == ls)
{
AINT[poz] = A[li];
return ;
}
build(li,mij,fs);
build(mij+1,ls,fd);
AINT[poz] = max(AINT[fs],AINT[fd]);
}
inline void insert(int li,int ls,int poz,int pozVal,int val)
{
if(li == ls)
{
AINT[poz] = val;
return ;
}
if(pozVal >= li && pozVal <= mij)
insert(li,mij,fs,pozVal,val);
else
insert(mij+1,ls,fd,pozVal,val);
AINT[poz] = max(AINT[fs],AINT[fd]);
}
inline int querry(int li,int ls,int poz,int a,int b)
{
int Max = 0;
if(a <= li && ls <= b)
return AINT[poz];
if(a <= mij)
Max = max(Max,querry(li,mij,fs,a,b));
if(b > mij)
Max = max(Max,querry(mij+1,ls,fd,a,b));
return Max;
}
int main()
{
int op,a,b;
citire();
build(1,N,1);
for(int i=1;i<=M;i++)
{
fscanf(f,"%d %d %d",&op,&a,&b);
switch(op)
{
case 0 : fprintf(g,"%d\n",querry(1,N,1,a,b));
break;
default : insert(1,N,1,a,b);
}
}
}