#include <cstdio>
#include <fstream>
#include <cmath>
#include <cstring>
#define BMAX 100010 * 5
#define DIM 100010
using namespace std;
//ifstream fin("arbint.in");
//ofstream fout("arbint.out");
FILE *f,*g;
int p, N, M, a, b, op, buffer, v[DIM], A[320], i, j, st, dr, c, d;
char buf[BMAX];
int solution;
int int_st[320];
int int_dr[320];
/*void gint(int &ans) {
ans = 0;
while (buf[buffer]<'0' || buf[buffer]>'9') {
buffer++;
if (buffer == BMAX - 1) {
fin.get(buf, BMAX, EOF);
buffer = 0;
}
}
while (buf[buffer] >= '0'&&buf[buffer] <= '9') {
ans = ans * 10 + buf[buffer++] - '0';
if (buffer == BMAX - 1) {
fin.get(buf, BMAX, EOF);
buffer = 0;
}
}
}*/
void update()
{
v[a] = b;
for(i = 1; i * p <= N;i ++){
if( int_st[i] <= a && int_dr[i] >= a )
{
A[i] = 0;
for(j = int_st[i]; j <= int_dr[i]; j ++){
A[i] = max(A[i],v[j]);
}
break;
}
}
}
void query()
{
c = N + 1; d = 0;
for(i = 1; i <= N / p + 1; i ++)
{
if( a <= int_st[i] && int_dr[i] <= b)
{
solution = max(solution, A[i]);
dr = max(dr, int_dr[i]);
if(int_st[i] < st)
{
st = int_st[i];
}
}
}
if(c == N + 1 && d == 0)
{
c = d = b;
}
for(i = a; i <= c; i ++)
{
solution = max(solution, v[i]);
}
for(i = d; i <= b; i ++)
{
solution = max(solution, v[i]);
}
}
int main()
{
f=fopen("arbint.in","r");
g=fopen("arbint.out","w");
//fin.get(buf, BMAX, EOF);
//gint(N);
//gint(M);
fscanf(f,"%d%d",&N,&M);
for(int i = 1; i <= N; i ++)
{
//gint(v[i]);
fscanf(f,"%d",&v[i]);
}
p = (int)sqrt(N);
for(i = 1; i * p <= N; i ++)
{
int_st[i] = (i - 1) * p + 1;
int_dr[i] = i * p;
for(j = int_st[i]; j <= int_dr[i]; j ++)
{
A[i] = max(A[i], v[j]);
}
}
while(M --)
{
//gint(op);
fscanf(f,"%d%d%d",&op,&a,&b);
if(op)
{
// gint(a), gint(b);
update();
}
else
{
//gint(a), gint(b);
solution = 0;
query();
//fout << solution << '\n';
fprintf(g,"%d\n",solution);
}
}
return 0;
}