using namespace std;
#include <cstdio>
#include <algorithm>
#define Nmax 100010
int v[Nmax], a[4 * Nmax];
int n, m, i, sol, x, y, t, mij;
void update(int nod, int st, int dr, int val, int poz){
mij = (st + dr) / 2;
if( st == dr ){
a[nod] = val;
return ;
}
if( poz <= mij ) update(nod<<1, st, mij, val, poz);
else update( (nod<<1)+1, mij+1, dr, val, poz);
a[nod] = max( a[nod<<1], a[(nod<<1) + 1] );
}
void query(int nod, int st, int dr, int p, int u){
int mij = (st + dr) / 2;
if( p <= st && dr <= u ){
sol = max(sol, a[nod]);
return ;
}
if( p <= mij ) query(nod<<1, st, mij, p, u);
if( u > mij ) query((nod<<1)+1, mij+1, dr, p, u);
}
int main(){
FILE *f = fopen("arbint.in", "r");
FILE *g = fopen("arbint.out", "w");
fscanf(f,"%d %d",&n, &m);
for( i = 1; i <= n; i++ )
fscanf(f,"%d",&v[i]);
for(i = 1; i <= n; i++)
update(1, 1, n, v[i], i);
for(i = 1; i <= m; i++){
fscanf(f,"%d %d %d",&t, &x, &y);
if(t == 1)
update(1, 1, n, y, x);
else{
sol = 0;
query(1, 1, n, x, y);
fprintf(g,"%d\n",sol);
}
}
fclose(f);
fclose(g);
return 0;
}