#include <bits/stdc++.h>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, M, x, cer, p1, p2, arb[4 * 100003];
void update(int poz, int val, int nod, int st, int dr)
{
if(st == dr) {
arb[nod] = val;
}
else {
int mid = (st + dr) / 2;
if(poz <= mid)
update(poz, val, nod * 2, st, mid);
else
update(poz, val, nod * 2 + 1, mid + 1, dr);
arb[nod] = max(arb[nod * 2], arb[nod * 2 + 1]);
}
}
int query(int a, int b, int nod, int st, int dr)
{
int partea_stanga = 0, partea_dreapta = 0;
if(a <= st && b >= dr)
return arb[nod];
else {
int mid = (st + dr) / 2;
if(a <= mid)
partea_stanga = query(a, b, 2 * nod, st, mid);
if(b > mid)
partea_dreapta = query(a, b, 2 * nod + 1, mid + 1, dr);
return max(partea_stanga, partea_dreapta);
}
}
int main()
{
f >> N >> M;
for(int i = 1; i <= N; i++)
f >> x, update(i, x, 1, 1, N);
for(int i = 1; i <= M; i++) {
f >> cer >> p1 >> p2;
if(cer == 1) update(p1, p2, 1, 1, N);
else g << query(p1, p2, 1, 1, N) << "\n";
}
return 0;
}