#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("arbint.in");
ofstream g ("arbint.out");
/// memoria se declara 4 * n
int arbore[400001];
int v[100001];
int n,q,poz_final,mx_rasp;
void gasire_mx(int st_arb,int dr_arb,int st,int dr,int poz)
{
/// daca intervalul din arbore e inclus in intervalul cautat
int mij = (st_arb+dr_arb)/2;
if(st_arb >=st && dr_arb<=dr)
{
mx_rasp = max(arbore[poz],mx_rasp);
return;
}
if(st_arb == dr_arb)
{
mx_rasp = max(arbore[poz],mx_rasp);
return;
}
if(st<=mij)
{
gasire_mx(st_arb,mij,st,dr,poz*2);
}
if(mij<dr)
{
gasire_mx(mij+1,dr_arb,st,dr,poz*2+1);
}
}
void update(int st,int dr,int poz,int poz_nr)
{
int mij = (st+dr)/2;
if(st == dr)
{
poz_final = max(poz,poz_final);
arbore[poz] = v[poz_nr];
return;
}
if(poz_nr<=mij)
update(st,mij,poz*2,poz_nr);
else
{
update(mij+1,dr,poz*2+1,poz_nr);
}
arbore[poz] = max(arbore[poz*2],arbore[poz*2+1]);
}
int main()
{
f >> n >> q;
for(int i = 1; i<=n; i++)
{
f >> v[i];
update(1,n,1,i);
}
int st,dr,c;
for(int i = 1; i<=q; i++)
{
f >> c>>st >> dr;
if(c == 0)
{
mx_rasp = 0;
gasire_mx(1,n,st,dr,1);
g << mx_rasp <<'\n';
}
else
{
v[st] = dr;
update(1,n,1,st);
}
}
}