#include <fstream>
#define dim (int)1e4 + 1
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int Arbore[400005];
void Update(int nod, int left, int right, int nr, int pozitie)
{
if (left == right)
{
Arbore[nod] = nr;
return;
}
int mid = (left + right) / 2;
if (pozitie <= mid)
Update(2 * nod, left, mid, nr, pozitie);
else
Update(2 * nod + 1, mid + 1, right, nr, pozitie);
Arbore[nod] = max(Arbore[2 * nod], Arbore[2 * nod + 1]);
}
int Query(int nod, int start, int end, int l, int r)
{
if (r<start || l>end)
return 0;
if (l <= start && end <= r)
return Arbore[nod];
int mid = (start + end) / 2;
int p1 = Query(2 * nod, start, mid, l, r);
int p2 = Query(2 * nod + 1, mid + 1, end, l, r);
return max(p1, p2);
}
int main()
{
int M, N;
fin >> N >> M;
for (int i = 1; i <= N; ++i)
{
int x;
fin >> x;
Update(1, 1, N, x, i);
}
for (int i = 1; i <= M; ++i)
{
int x, a, b;
fin >> x >> a >> b;
if (x == 1)
Update(1, 1, N, b, a);
else
fout<<Query(1, 1, N, a, b)<<'\n';
}
}