#include <fstream>
using namespace std;
ifstream ka("arbint.in");
ofstream ki("arbint.out");
const int N_MAX = 100000;
int sol[3 * N_MAX];
int n, m, a, b;
char c;
int cauta(int a, int b, int inc, int sf, int nod)
{
if(a == inc && b == sf)
return sol[nod];
else if(b <= (inc + sf) / 2)
return cauta(a, b, inc, (inc + sf) / 2, nod * 2);
else if(a >= (inc + sf) / 2 + 1)
return cauta(a, b, (inc + sf) / 2 + 1, sf, nod * 2 + 1);
else
return max(cauta(a, (inc + sf) / 2, inc, (inc + sf) / 2, nod * 2), cauta((inc + sf) / 2 + 1, b, (inc + sf) / 2 + 1, sf, nod * 2 + 1));
}
void modifica(int a, int b, int inc, int sf, int nod)
{
if(inc == sf)
sol[nod] = b;
else
{
if(a <= (inc + sf) / 2)
modifica(a, b, inc, (inc + sf) / 2, nod * 2);
else
modifica(a, b, (inc + sf) / 2 + 1, sf, nod * 2 + 1);
sol[nod] = max(sol[nod * 2], sol[nod * 2 + 1]);
}
}
int main()
{
ka >> n >> m;
for(int i = 1; i <= n; i++)
{
ka >> b;
modifica(i, b, 1, n, 1);
}
for(int i = 1; i <= m; i++)
{
ka >> c >> a >> b;
if(c == '0')
{
if(a > b)
swap(a, b);
ki << cauta(a, b, 1, n, 1) << '\n';
}
else
modifica(a, b, 1, n, 1);
}
}