#include <fstream>
std::ifstream in ("arbint.in");
std::ofstream out ("arbint.out");
int maxim (int a, int b)
{
return (a > b) ? a : b;
}
class AInt
{
static const int MAXN = 100000;
int arb[4 * MAXN];
public:
void Update(int poz, int st, int dr, int index, int val);
int Query (int poz, int st, int dr, int stq, int drq);
};
void AInt::Update(int poz, int st, int dr, int index, int val)
{
if (st == dr){
arb[poz] = val;
return;
}
int mij = (st + dr)/2;
if (index <= mij)
Update(poz*2, st, mij, index, val);
else
Update(poz*2+1, mij+1, dr, index, val);
arb[poz] = maxim( arb[poz * 2], arb[poz * 2 + 1] );
}
int AInt::Query (int poz, int st, int dr, int stq, int drq)
{
if (stq <= st && dr <= drq) {
return arb[poz];
}
int mij = (st + dr) / 2;
if (drq <= mij)
return Query(poz * 2, st, mij, stq, drq);
if (stq > mij)
return Query(poz * 2 + 1, mij + 1, dr, stq, drq);
return maxim(Query(poz * 2, st, mij, stq, drq), Query(poz * 2 + 1, mij + 1, dr, stq, drq));
}
int main()
{
AInt aint;
int N, M, op, a, b;
in >> N >> M;
for (int i = 0; i < N; ++i) {
int x;
in >> x;
aint.Update(1, 0, N - 1, i, x);
}
for (int i = 0; i < M; ++i){
in >> op >> a >> b;
if ( op == 0 )
out << aint.Query(1, 0, N - 1, a - 1, b - 1) << '\n';
if ( op == 1 )
aint.Update(1, 0, N - 1, a - 1, b);
}
return 0;
}