#include <iostream>
#include <fstream>
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int arb_int[4000001];
void facere(int nod, int st, int dr, int poz, int val)
{
if (poz < st or poz > dr) return;
if (st == dr){
arb_int[nod] = val;
return;
}
int mjl = (st + dr) / 2;
if (mjl >= poz) facere(2*nod, st, mjl, poz, val);
else facere(2*nod+1, mjl+1, dr, poz, val);
arb_int[nod] = max(arb_int[2*nod], arb_int[2*nod+1]);
}
int get_max(int nod, int st, int dr, int q_st, int q_dr)
{
if (q_st > dr or q_dr < st) return 0;
if (st >= q_st and dr <= q_dr) return arb_int[nod];
int mjl = (st + dr) / 2;
return max(get_max(2*nod, st, mjl, q_st, q_dr), get_max(2*nod+1, mjl+1, dr, q_st, q_dr));
}
void change (int nod, int st, int dr, int a, int b)
{
if (a > dr or b < st) return;
if (st == dr){
arb_int[nod] = b;
}
int mjl = (st + dr) / 2;
if (a <= mjl) change(2*nod, st, mjl, a, b);
else change(2*nod+1, mjl+1, dr, a, b);
arb_int[nod] = max(arb_int[2*nod], arb_int[2*nod+1]);
}
int main()
{
int n, t;
fin>>n>>t;
for (int i = 1; i <= n; i++){
int a;
fin>>a;
facere(1, 1, n, i, a);
}
for (int i = 1; i <= t; i++){
int op, a, b;
fin>>op>>a>>b;
if (op == 0){
fout<<get_max(1, 1, n, a, b)<<"\n";
}
else{
change(1, 1, n, a, b);
}
}
return 0;
}