#include <fstream>
using namespace std;
void construieste(int* v, int* aint, int s, int d, int nod)
{
if(s == d)
{
aint[nod] = v[s];
return ;
}
int mij = (s + d) / 2;
construieste(v, aint, s, mij, nod * 2);
construieste(v, aint, mij + 1, d, nod * 2 + 1);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
void modifica(int* aint, int s, int d, int nod, int pozitie, int valoare_noua)
{
if(s == d)
{
aint[nod] = valoare_noua;
return ;
}
int mij = (s + d) / 2;
if(pozitie <= mij)
modifica(aint, s, mij, nod * 2, pozitie, valoare_noua);
else
modifica(aint, mij + 1, d, nod * 2 + 1, pozitie, valoare_noua);
aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
void raspunde(int* aint, int s, int d, int nod, int* Max, int poz_s, int poz_d)
{
if(poz_s <= s && poz_d >= d)
{
if(aint[nod] > *Max)
*Max = aint[nod];
return ;
}
int mij = (s + d) / 2;
if(poz_s <= mij)
raspunde(aint, s, mij, nod * 2, Max, poz_s, poz_d);
if(poz_d > mij)
raspunde(aint, mij + 1, d, nod * 2 + 1, Max, poz_s, poz_d);
}
int main()
{
ifstream f("arbint.in");
ofstream g("arbint.out");
int i, n, nr_operatii, tip, a, b;
f >> n >> nr_operatii;
int* v=(int*)malloc(sizeof(int) * (n + 5));
i=1;
while(i < 2 * n)
i = i << 1;
int* aint=(int*)malloc(sizeof(int) * (i + 5));
for(i = 1; i <= n; i++)
f >> v[i];
construieste(v, aint, 1, n, 1);
free(v);
for(i = 1; i <= nr_operatii; i++)
{
f >> tip >> a >> b;
if(tip == 1)
modifica(aint, 1, n, 1, a, b);
else
{
int Max = 0;
raspunde(aint, 1, n, 1, &Max, a, b);
g << Max << '\n';
}
}
free(aint);
return 0;
}