#include <iostream>
#include <cstdio>
using namespace std;
FILE *in, *out;
const int dim = 100005;
int MaxArb[4 * dim];
int Max, start, finish;
int Pos, Val;
int N, Q;
int maxim(int x, int y)
{
if(x > y) return x;
else
return y;
}
void Update(int node, int Left, int Right)
{
if(Left == Right) {MaxArb[node] = Val; return;}
int mid = (Left + Right) / 2;
if(Pos <= mid) Update(2 * node, Left, mid);
else
Update(2 * node + 1, mid + 1, Right);
MaxArb[node] = maxim(MaxArb[2 * node], MaxArb[2 * node + 1]);
}
void Query(int node, int Left, int Right)
{
if( (start <= Left) && (finish >= Right) )
{
Max = maxim(Max, MaxArb[node]);
return;
}
int mid = (Left + Right) / 2;
if(start <= mid) Query(2 * node, Left, mid);
if(finish > mid) Query(2 * node + 1, mid + 1, Right);
}
int main()
{
in = fopen("arbint.in", "r");
out = fopen("arbint.out", "w");
int i, x, T;
fscanf(in, "%d %d", &N, &Q);
for(i = 1; i <= N; i++)
{
fscanf(in, "%d", &x);
Pos = i;
Val = x;
Update(1, 1, N);
}
for(i = 1; i <= Q; i++)
{
fscanf(in, "%d %d %d", &T, &start, &finish);
if(T == 0)
{
Max = -1;
Query(1, 1, N);
fprintf(out, "%d\n", Max);
}
else
{
Pos = start;
Val = finish;
Update(1, 1, N);
}
}
return 0;
}