Pagini recente » Cod sursa (job #2909907) | Cod sursa (job #859597) | Cod sursa (job #2246308) | Cod sursa (job #1558428) | Cod sursa (job #2311936)
#include <iostream>
#include <fstream>
#define INF 2147483647
#define NMAX 500005
using namespace std;
ifstream f("algsort.in");
ofstream g("algsort.out");
struct arbore_intervale
{
int val,poz;
};
arbore_intervale aint[1200000],minim;
int start,finish,pozitie,valoare,n,x;
void build_aint(int nod,int st,int dr)
{
if(st==dr)
{
f>>x;
aint[nod].val=x;
aint[nod].poz=st;
return;
}
int mij=(st+dr)/2;
build_aint(2*nod,st,mij);
build_aint(2*nod+1,mij+1,dr);
if(aint[2*nod].val<aint[2*nod+1].val)
{
aint[nod]=aint[2*nod];
}
else
{
aint[nod]=aint[2*nod+1];
}
}
void update(int nod,int st,int dr)
{
if(st==dr)
{
aint[nod].val=valoare;
aint[nod].poz=st;
return;
}
int mij=(st+dr)/2;
if(pozitie<=mij)
{
update(2*nod,st,mij);
}
else
{
update(2*nod+1,mij+1,dr);
}
if(aint[2*nod].val<aint[2*nod+1].val)
{
aint[nod]=aint[2*nod];
}
else
{
aint[nod]=aint[2*nod+1];
}
}
void query(int nod,int st,int dr)
{
if(start<=st && dr<=finish)
{
if(aint[nod].val<minim.val)
{
minim=aint[nod];
}
return;
}
int mij=(st+dr)/2;
if(start<=mij)
{
query(2*nod,st,mij);
}
if(mij<finish)
{
query(2*nod+1,mij+1,dr);
}
}
int main()
{
int i;
f>>n;
build_aint(1,1,n);
for(i=1;i<=n;i++)
{
minim.val=INF;
minim.poz=0;
start=1;
finish=n;
query(1,1,n);
g<<minim.val<<" ";
pozitie=minim.poz;
valoare=INF;
update(1,1,n);
}
return 0;
}