#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 100000;
int v[NMAX + 5];
struct Aint
{
int a[4 * NMAX];
void Build(int first, int last, int node)
{
if(first == last)
{
a[node] = v[first];
return;
}
int mid = (first + last) / 2;
Build(first, mid, 2 * node);
Build(mid + 1, last, 2 * node + 1);
a[node] = max(a[2 * node], a[2 * node + 1]);
}
void Update(int first, int last, int node, int val, int x)
{
if(first == last)
{
a[node] = x;
return;
}
int mid = (first + last) / 2;
if(mid < val)
Update(mid + 1, last, node * 2 + 1, val, x);
else
Update(first, mid, node * 2, val ,x);
a[node] = max(a[node * 2], a[node * 2 + 1]);
}
int Query(int node, int first, int last, int left, int right)
{
if(first >= left && last <= right)
return a[node];
if(first > right || last < left)
return 0;
int mid = (first + last) / 2;
return max(Query(2 * node, first, mid, left, right), Query(2 * node + 1, mid + 1, last, left, right));
}
};
Aint Arb;
int main()
{
int n, m, q, x, y;
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
Arb.Build(1, n, 1);
/*for(int i = 1; i <= n; i++)
fout << Arb.a[i] <<' ' ;
fout << '\n';*/
for(int i = 0; i < m; i++)
{
fin >> q >> x >> y;
if(q == 1)
Arb.Update(1, n, 1, x, y);
else
fout << Arb.Query(1, 1, n, x, y) << ' ' ;
}
return 0;
}