Pagini recente » Cod sursa (job #3183592) | Cod sursa (job #1843883)
//Sortare cu arbore de intervale
#include<iostream>
#include<fstream>
using namespace std;
ifstream fin("algsort.in");
ofstream fout("algsort.out");
unsigned int v[500001], n;
struct nod
{
unsigned int min1, lst, ldr;
nod *st, *dr;
} *arb;
void citire()
{
fin>>n;
for(int i = 1; i <= n; ++i)
{
fin>>v[i];
}
}
void constrarb(nod *nod1)
{
if(nod1->lst == nod1->ldr)
{
nod1->min1 = v[nod1->lst];
}
else
{
int mid = (nod1->lst + nod1->ldr) / 2;
nod *k;
k = new(nod);
k->lst = nod1->lst;
k->ldr = mid;
nod1->st = k;
k = new(nod);
k->lst = mid + 1;
k->ldr = nod1->ldr;
nod1->dr = k;
constrarb(nod1->st);
constrarb(nod1->dr);
if(nod1->st->min1 < nod1->dr->min1)
{
nod1->min1 = nod1->st->min1;
}
else
{
nod1->min1 = nod1->dr->min1;
}
}
}
void stergeremin(nod *nod1)
{
if(nod1->lst == nod1->ldr)
{
nod1->min1 = 4294967295;
}
else
{
if(nod1->st->min1 == nod1->min1)
{
stergeremin(nod1->st);
}
else
{
stergeremin(nod1->dr);
}
if(nod1->st->min1 < nod1->dr->min1)
{
nod1->min1 = nod1->st->min1;
}
else
{
nod1->min1 = nod1->dr->min1;
}
}
}
int main()
{
citire();
arb = new(nod);
arb->lst = 1;
arb->ldr = n;
constrarb(arb);
for(int i = 1; i <= n; ++i)
{
fout<<arb->min1<<" ";
stergeremin(arb);
}
}