#include <bits/stdc++.h>
#define int long long
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n, m, v[100100];
int aint[400400];
void update(int nod, int st, int dr, int poz, int val)
{
if(st == dr)
{
aint[nod] = val;
return;
}
int mid = (st + dr) / 2;
if(poz <= mid)
{
update(2 * nod, st, mid, poz, val);
}
else
{
update(2 * nod + 1, mid + 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)
{
if(st >= l && dr <= r)
{
return aint[nod];
}
if(st > r || dr < l || st > dr)
{
return 0;
}
int mid = (st + dr) / 2;
return max(query(2 * nod, st, mid, l, r),
query(2 * nod + 1, mid + 1, dr, l, r));
}
signed main()
{
fin >> n >> m;
for(int i = 1; i <= n; i ++)
{
fin >> v[i];
update(1, 1, n, i, v[i]);
}
while(m--)
{
int a, b, c;
fin >> a >> b >> c;
if(a == 1)
{
update(1, 1, n, b, c);
}
else
{
fout << query(1, 1, n, b, c) << '\n';
}
}
return 0;
}