#include <bits/stdc++.h>
using namespace std;
ifstream in ("arbint.in");
ofstream out ("arbint.out");
int n, q, v[100001], aint[4 * 100001];
void build (int st, int dr, int nod)
{
if (st == dr)
{
aint[nod] = v[st];
return;
}
int mid = (st + dr) / 2;
build(st, mid, nod << 1);
build(mid + 1, dr, nod << 1 | 1);
aint[nod] = max (aint[nod <<1], aint[nod<<1|1]);
}
void update (int st, int dr, int nod, int poz, int value)
{
if (st == dr && dr == poz)
{
aint[nod] = value;
return;
}
int mid = (st + dr) / 2;
if (poz < st || poz > dr)
return;
update (st, mid, nod << 1, poz, value);
update (mid + 1, dr, nod << 1 | 1, poz , value);
aint[nod] = max (aint[nod << 1], aint[nod << 1 |1]);
}
int query (int st, int dr, int nod, int l, int r)
{
if (l<= st && dr <= r)
return aint[nod];
if (r < st || l > dr)
return INT_MIN;
int mid = (st + dr) / 2;
int rez1 = query(st, mid, nod << 1, l ,r);
int rez2 = query(mid + 1, dr, nod << 1 | 1, l , r);
return max (rez1, rez2);
}
int main ()
{
in >> n >> q;
for (int i = 1;i<=n;++i)
in >> v[i];
build (1, n, 1);
while (q--)
{
int type;
in >> type;
if (type == 1)
{
int poz, value;
in >> poz >> value;
update (1, n, 1, poz, value);
}
if (type == 0)
{
int l, r;
in >> l >> r;
out << query (1,n,1,l,r) << '\n';
}
}
}