Cod sursa(job #2311935)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 3 ianuarie 2019 21:09:47
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.77 kb
#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[2*NMAX],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;
}