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