#include <stdio.h>
FILE *fin = fopen("arbint.in" , "r");
FILE *fout = fopen("arbint.out" , "w");
# define MAXN 100000
int MaxArb[5 * MAXN +1];
int pos , val , start , finish , maxim , m , n ,x ,tip ,a ,b ,j;
void update();
void intrebare();
int Maxim(int a , int b)
{
if(a > b) return a;
return b;
}
void update(int nod, int st , int dr)
{
if(st == dr)
{
MaxArb[nod] = val;//sunt pe ultimul nivel al arborelui si update
return;
}
int mij;
mij = (st + dr) / 2;
if(pos <= mij) update(2 * nod,st,mij); //ale interval stanga
else update(2 * nod + 1,mij + 1,dr);//aleg interval dreapta
MaxArb[nod] = Maxim(MaxArb[nod*2] , MaxArb[nod*2+1]);
}
void intrebare(int nod , int st, int dr)
{
if(start <= st && dr <= finish)
{
if( MaxArb[nod] > maxim) maxim = MaxArb[nod];
return;
}
int mij;
mij = (st + dr) / 2;
if(mij >= start) intrebare(2 * nod, st , mij);
if(mij < finish) intrebare(2 * nod + 1, mij + 1, dr);
}
int main()
{
fscanf(fin , "%d%d" , &n , &m);
for( j = 1; j <= n; j++ )
{
fscanf(fin , "%d", &x);
val = x;
pos = j;
update(1,1,n);
}
for(j = 1; j <= m; j++)
{
fscanf(fin , "%d", &tip);
if(tip == 1)
{
fscanf(fin , "%d%d", &a , &b);
val = b;
pos = a;
update(1,1,n);
}
else
{
fscanf(fin , "%d%d", &a, &b);
start = a;
finish = b;
maxim = -1;
intrebare(1,1,n);
fprintf(fout , "%d\n" , maxim);
}//
}
return 0;
}