#include <fstream>
using namespace std;
ifstream cin("arbint.in");
ofstream cout("arbint.out");
int nr, operatii, val, a, b, tip;
struct Nod
{
Nod *st, *dr;
int val;
Nod()
{
st = NULL;
dr = NULL;
val = 0;
}
};
void update(int poz, int val, int st, int dr, Nod *nod)
{
if(st == dr)
{
nod->val = val;
return;
}
if(nod->st == NULL)
nod->st = new Nod;
if(nod->dr == NULL)
nod->dr = new Nod;
int mijloc = (st+dr)/2;
if(poz <= mijloc)
update(poz, val, st, mijloc, nod->st);
else
update(poz, val, mijloc+1, dr, nod->dr);
nod->val = max(nod->st->val, nod->dr->val);
}
int maxim(int ST, int DR, int st, int dr, Nod *nod)
{
int raspuns=-10000000;
if(ST <= st && st <= dr && dr <= DR)
return nod->val;
int mijloc = (st+dr)/2;
if(ST <= mijloc)
raspuns=max(raspuns,maxim(ST,DR,st,mijloc,nod->st));
if(DR > mijloc)
raspuns=max(raspuns,maxim(ST,DR,mijloc+1,dr,nod->dr));
return raspuns;
}
int main()
{
cin >> nr >> operatii;
Nod *radacina;
radacina = new Nod;
for(int i=0; i < nr; i++)
{
cin >> val;
update(i, val, 0, nr-1, radacina);
}
for(int i=1; i <= operatii; i++)
{
cin >> tip >> a >> b;
if(tip == 1)
{
a--;
update(a, b, 0, nr-1, radacina);
}
else
{
a--;
b--;
cout << maxim(a,b,0,nr-1,radacina) << '\n';
}
}
}