#include <bits/stdc++.h>
using namespace std;
const int NMAX = 1e5+5;
int arb[4 * NMAX];
ifstream f("arbint.in");
ofstream g("arbint.out");
int N, Q;
int ans;
int v[NMAX];
void update (int node, int st, int dr, int pos, int val)
{
if (st == dr)
{
arb[node] = val;
return;
}
int mid = (st + dr) / 2;
if (pos <= mid)
{
update (2 * node, st, mid, pos, val);
}
else
{
update (2 * node + 1, mid + 1, dr, pos, val);
}
arb[node] = max (arb[2 * node], arb[2 * node + 1]);
}
void query (int node, int arbSt, int arbDr, int st, int dr)
{
if (arbDr < st || arbSt > dr)
return;
if (arbSt >= st && arbDr <= dr)
{
ans = max (ans, arb[node]);
return;
}
int mid = (arbSt + arbDr) / 2;
query (2 * node, arbSt, mid, st, dr);
query (2 * node + 1, mid + 1, arbDr, st, dr);
}
int main ()
{
f >> N >> Q;
for (int i = 1; i <= N; ++i)
{
f >> v[i];
update (1, 1, N, i, v[i]);
}
bool tip;
int a, b;
while (Q --)
{
f >> tip >> a >> b;
if (!tip)
{
ans = 0;
query (1, 1, N, a, b);
g << ans << "\n";
}
else
{
update (1, 1, N, a, b);
}
}
return 0;
}