#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int a[100050], s[250000];
void Creare(int nod,int st, int dr)
{
if(st == dr)
{
s[nod] = a[st];
return;
}
int mij = (st + dr) / 2;
Creare(2 * nod, st, mij);
Creare(2 * nod + 1, mij + 1, dr);
s[nod] = max(s[2 * nod], s[2 * nod + 1]);
}
int Raspuns(int nod, int st, int dr, int a, int b)
{
if(st >= a && dr <= b)
return s[nod];
if(dr < a || st > b)
return 0;
int mij = (st + dr) / 2;
return max(Raspuns(2 * nod, st, mij, a, b), Raspuns(2 * nod + 1, mij+1, dr, a, b));
}
int Find(int nod, int st, int dr, int poz)
{
if(st == dr && st == poz)
return nod;
int mij = (st + dr) / 2;
if(poz <= mij)
return Find(2 * nod, st, mij, poz);
if(poz > mij)
return Find(2 * nod + 1, mij + 1, dr, poz);
}
void Actualizare(int nod)
{
if(nod != 1)
{s[nod / 2] = max(s[nod / 2 * 2], s[nod / 2 * 2 + 1]);
Actualizare(nod / 2);}
}
int main()
{
int m, n, x, y, z, pozs, i;
fin >> n >> m;
for(i = 1;i <= n;i++)
fin >> a[i];
Creare(1,1,n);
for(i = 1;i <= m;i++)
{
fin >> x >> y >> z;
if(x == 0)
fout << Raspuns(1, 1, n, y, z)<<"\n";
if(x == 1)
{
pozs = Find(1, 1, n, y);
s[pozs] = z;
Actualizare(pozs);
}
}
return 0;
}