Cod sursa(job #1843883)

Utilizator teo.cons98Constantin Teodor-Claudiu teo.cons98 Data 9 ianuarie 2017 15:16:10
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
//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);
    }
}