#include <fstream>
#include <iostream>
#include <climits>
using namespace std;
ifstream f ("aint.in");
ofstream g ("aint.out");
int n,m,c,x,y,min_rasp = INT_MAX;
int i;
int arbore[400001];
void update(int st,int dr,int nr,int poz_nr_in_vector,int poz)
{
if(st == dr)
{
arbore[poz] = nr;
return;
}
int mij= (st+dr)/2;
if(poz_nr_in_vector<=mij)
{
update(st,mij,nr,poz_nr_in_vector,poz*2);
}
else
update(mij+1,dr,nr,poz_nr_in_vector,poz*2+1);
arbore[poz] = min(arbore[poz*2],arbore[poz*2+1]);
}
void gasire_min(int st_arb,int dr_arb,int st,int dr,int poz)
{
if(st <= st_arb && dr_arb<=dr)
{
min_rasp = min(min_rasp,arbore[poz]);
if(i == 8)
cout << min_rasp<< " "<<st_arb<< " "<<dr_arb<< " "<<poz<< endl;
return;
}
int mij = (st_arb + dr_arb) /2;
if(st<=mij)
{
gasire_min(st_arb,mij,st,dr,poz*2);
}
if(mij<dr)
{
gasire_min(mij+1,dr_arb,st,dr,poz*2+1);
}
}
int main()
{
f >> n >> m;
for(int i = 1;i<=100000;i++)
arbore[i] = INT_MAX;
for(int i = 1;i<=n;i++)
{
f >> x;
update(1,n,x,i,1);
}
for(i =1;i<=m;i++)
{
f >> c >>x>>y;
if(c == 1)
{
update(1,n,y,x,1);
}
else
{
min_rasp = INT_MAX;
gasire_min(1,n,x,y,1);
g << min_rasp<< '\n';
}
for(int j = 1;j<=n;j++)
cout << arbore[j]<< " ";
cout << endl;
}
}