#include <iostream>
#include <fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int NMAX = 1e5;
int n, m;
int res;
int v[1 + NMAX];
int aint[1 + 4 * NMAX];
void add(int node, int pos, int le, int ri, int v)
{
int mid = (le + ri) / 2;
if(le == ri && mid == pos)
{
aint[node] = v;
}
else
{
if(pos <= mid)
add(2 * node, pos, le, mid, v);
else
add(2 * node + 1, pos, mid + 1, ri, v);
aint[node] = max(aint[2 * node], aint[2 * node + 1]);
}
}
void query(int node, int le, int ri, int fr, int to)
{
int mid = (fr + to) / 2;
if(le <= fr && to <= ri)
{
res = max(res, aint[node]);
return;
}
if(le > to || ri < fr)
return;
query(2 * node, le, ri, fr, mid);
query(2 * node + 1, le, ri, mid + 1, to);
}
int main()
{
in >> n >> m;
for(int i = 1; i <= n; i++)
{
in >> v[i];
add(1, i, 1, n, v[i]);
}
for(int i = 1; i <= m; i++)
{
int code, x, y;
in >> code >> x >> y;
if(code == 1)
{
add(1, x, 1, n, y);
}
else
{
res = 0;
query(1, x, y, 1, n);
out << res << '\n';
}
}
in.close();
out.close();
return 0;
}