#include<fstream>
#define NMAX 100007
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int ai[4*NMAX],v[NMAX], M, N;
void build(int nod, int st, int dr)
{
if (st == dr)
{
ai[nod] = v[st];
return;
}
else
{
int mij = (st + dr)/2;
build(2 * nod, st, mij);
build(2 * nod + 1, mij + 1, dr);
ai[nod] = max(ai[2 * nod], ai[2 * nod + 1]);
}
}
void update(int nod, int pozitie, int val, int st, int dr)
{
if (st == dr)
{
ai[nod] = val;
}
else
{
int mij = (st + dr)/2;
if (pozitie <= mij)
{
update(2 * nod, pozitie, val, st, mij);
}
else
{
update(2 * nod + 1, pozitie, val, mij + 1, dr);
}
ai[nod] = max(ai[2 * nod], ai[2 * nod + 1]);
}
}
int maxim(int nod, int st, int dr, int a, int b)
{
if (dr < a || b < st) //intervale disjuncte
{
return 0;
}
else
{
if(a <= st && dr <= b) //interval inclus complet in alt interval
{
return ai[nod];
}
else
{
int mij = (st + dr)/2;
int sum1 = maxim(2 * nod, st, mij, a, b); // interval inclus partial in alt interval
int sum2 = maxim(2 * nod + 1, mij + 1, dr, a, b);
return max(sum1, sum2);
}
}
}
int main()
{
fin >> N >> M;
int i;
for (i = 1; i <= N; i++)
{
fin >> v[i];
}
build(1,1,N);
for(i = 1; i <= M; i++)
{
int a, b, digit ;
fin >> digit >> a >> b;
if (digit == 0)
{
fout << maxim(1, 1, N, a, b)<<"\n";
}
if(digit == 1)
{
update(1, a, b, 1, N);
}
}
fin.close();
fout.close();
return 0;
}