#include <iostream>
#include <fstream>
using namespace std;
int arb[4*100003],m,n,maxim,v;
void Update(int val,int nod, int st, int dr,int pos)
{
if(st==dr)
{
arb[nod]=val;
return;
}
int mij;
mij=(st+dr)/2;
if(pos<=mij)
Update(val,nod*2,st,mij,pos);
else
Update(val,nod*2+1,mij+1,dr,pos);
arb[nod]=max(arb[nod*2],arb[nod*2+1]);
}
void Interogare(int nod,int st, int dr,int a, int b)
{
if(a<=st&&dr<=b)
{
maxim=max(maxim,arb[nod]);
return;
}
int mij;
mij=(st+dr)/2;
if(a<=mij)
Interogare(nod*2,st,mij,a,b);
if(mij<b)
Interogare(nod*2+1,mij+1,dr,a,b);
}
int main()
{
fstream f("arbint.in",ios::in),g("arbint.out",ios::out);
int i,j,x,a,b;
f>>n>>m;
for(i=1;i<=n;i++)
{
f>>x;
Update(x,1,1,n,i);//valoarea, indicele de inceput, inceputul intervalului, sfarsitul intervalului, indicele de gasit
}
for(i=1;i<=n;i++)
cout<<arb[i]<<" ";
for(i=1;i<=m;i++)
{
f>>v>>a>>b;
if(v==0)
{
maxim=0;
Interogare(1,1,n,a,b);//indicele de inceput,capetele intervalului mare , stanga, dreapta intervalului de gasit
g<<maxim<<'\n';
}
else
Update(b,1,1,n,a);
}
}