#include <iostream>
#include <cstdio>
using namespace std;
FILE *in, *out;
const int dmax = 262144;
int Pos, Val;
int MaxArb[dmax];
int Max, a, b;
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(Left >= a && Right <= b)
{
Max = maxim(Max, MaxArb[node]);
return;
}
int mid = (Left + Right) / 2;
if(a <= mid) query(2 * node, Left, mid);
if(b > mid) query(2 * node + 1, mid + 1, Right);
}
int main()
{
in = fopen("arbint.in", "r");
out = fopen("arbint.out", "w");
int i, T, x;
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, &a, &b);
if(T == 0)
{
Max = -1;
query(1, 1, N);
fprintf(out, "%d\n", Max);
}
else
{
Pos = a;
Val = b;
Update(1, 1, N);
}
}
return 0;
}