#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
typedef long long ll;
const int N = 1e5 + 5;
int n, q, v[N], aint[2 * N];
void build(int nod, int st, int dr)
{
if (st == dr)
aint[nod] = v[st];
else
{
int m = (st + dr) / 2;
build(2 * nod, st, m);
build(2 * nod + 1, m + 1, dr);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
}
void Update(int nod, int st, int dr, int poz, int val)
{
int m = (st + dr) / 2;
if (st == dr)
{
aint[nod] = val;
return;
}
if (poz <= m)
Update(2 * nod, st, m, poz, val);
else
Update(2 * nod + 1, m + 1, dr, poz, val);
aint[nod] = max(aint[2 * nod], aint[2 * nod + 1]);
}
int Query(int nod, int st, int dr, int l, int r)
{
int m = (st + dr) / 2;
if (l <= st && dr <= r)
return aint[nod];
int rasp = 0;
if (l <= m)
rasp = max(rasp, Query(2 * nod, st, m, l, r));
if (r > m)
rasp = max(rasp, Query(2 * nod + 1, m + 1, dr, l, r));
return rasp;
}
int main()
{
fin >> n >> q;
for (int i = 1; i <= n; i++)
fin >> v[i];
build(1, 1, n);
while (q--)
{
int op, a, b;
fin >> op >> a >> b;
if (op == 0)
{
int rasp = Query(1, 1, n, a, b);
fout << rasp << '\n';
}
if (op == 1)
{
Update(1, 1, n, a, b);
}
}
}