#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int arbint[400005], A[100005];
int build(int start, int eend, int nod){
if (start == eend)
{
arbint[nod] = A[start];
return A[start];
}
int mid = (start + eend)/2;
arbint[nod] = max(build(start, mid, nod * 2 + 1), build(mid + 1, eend, nod * 2 + 2));
return arbint[nod];
}
void update(int i, int stanga, int dreapta, int nod, int nou)
{
if (i < stanga || i > dreapta)
return;
if (stanga == dreapta){
arbint[nod] = nou;
return;
}
if(stanga != dreapta) /// adica am fii
update(i, stanga, (stanga + dreapta)/2, nod * 2 + 1, nou);
update(i, (stanga + dreapta) / 2 + 1, dreapta, nod * 2 + 2, nou);
arbint[nod] = max(arbint[2 * nod + 1], arbint[2 * nod + 2]);
}
int getmax(int i, int j, int nod, int seg_stanga, int seg_dreapta){
if (i <= seg_stanga && j >= seg_dreapta)
{
return arbint[nod];
}
if (seg_dreapta < i || seg_stanga > j)
return INT_MIN;
int mid = (seg_stanga + seg_dreapta) / 2;
return max(getmax(i, j, 2 * nod + 1, seg_stanga, mid), getmax(i, j, 2 * nod + 2, mid + 1, seg_dreapta));
}
int main()
{
int N, M;
f >> N >> M;
for (int i = 0; i < N; ++i)
f >> A[i];
int a, b, optiune;
build(0, N - 1, 0);
for (int i = 0; i < M; ++i)
{
f >> optiune >> a >> b;
if (optiune == 0)
g << getmax(a - 1, b -1, 0, 0, N - 1) << "\n";
else
update(a - 1, 0, N - 1, 0, b);
}
return 0;
}