#include <fstream>
#define lSon(x) (2 * x)
#define rSon(x) (2 * x + 1)
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.in");
int A[100005], N, M, aint[200025], answer;
void Gen(int nod, int left, int right) {
if (left == right) {
aint[nod] = A[left];
return;
}
int mid = (left + right) / 2;
Gen(lSon(nod), left, mid);
Gen(rSon(nod), mid + 1, right);
aint[nod] = max(aint[lSon(nod)], aint[rSon(nod)]);
}
void Update(int nod, int left, int right, const int &poz, const int &val) {
if (left == right) {
aint[nod] = val;
A[poz] = val;
return;
}
int mid = (left + right) / 2;
if (poz <= mid)
Update(lSon(nod), left, mid, poz, val);
if (poz > mid)
Update(rSon(nod), mid + 1, right, poz, val);
aint[nod] = max(aint[lSon(nod)], aint[rSon(nod)]);
}
void Query(int nod, int left, int right, const int &lQuery, const int &rQuery) {
if (lQuery <= left && right <= rQuery) {
answer = max(answer, aint[nod]);
return;
}
int mid = (left + right) / 2;
if (lQuery <= mid)
Query(lSon(nod), left, mid, lQuery, rQuery);
if (rQuery > mid)
Query(rSon(nod), mid + 1, right, lQuery, rQuery);
}
int main()
{
cin >> N >> M;
for (int i = 1; i <= N; i++)
cin >> A[i];
Gen(1, 1, N);
for (int i = 1; i <= M; i++)
{
int q;
cin >> q;
int a, b;
cin >> a >> b;
if (q == 0) {
Query(1, 1, N, a, b);
cout << answer << '\n';
answer = 0;
}
else
Update(1, 1, N, a, b);
}
return 0;
}