Cod sursa(job #2309640)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 29 decembrie 2018 15:08:01
Problema Sortare prin comparare Scor 60
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.14 kb
#include<fstream>

using namespace std;

ifstream cin("algsort.in");
ofstream cout("algsort.out");

int n,v[500005];

struct Interval{

    int value;
    int index;

} Empty={(1LL<<31)-1,0},Min[(2<<20)+5];

Interval SegmentTree(int node,int left,int right){

    if(left==right){

        Min[node].value=v[left];
        Min[node].index=left;
        return Min[node];

    }

    int middle=(left+right)/2;

    Interval LeftSubTree=SegmentTree(2*node,left,middle);
    Interval RightSubTree=SegmentTree(2*node+1,middle+1,right);

    if(LeftSubTree.value<=RightSubTree.value)

        Min[node]=LeftSubTree;

    else

        Min[node]=RightSubTree;

    return Min[node];

}

Interval Query(int node,int left,int right,int x,int y){

    if(x<=left && right<=y)

        return Min[node];

    if(x>right || y<left)

        return Empty;

    int middle=(left+right)/2;

    Interval LeftSubTree=Query(2*node,left,middle,x,y);
    Interval RightSubTree=Query(2*node+1,middle+1,right,x,y);

    if(LeftSubTree.value<=RightSubTree.value)

        return LeftSubTree;

    else

        return RightSubTree;

}

Interval Update(int node,int left,int right,int index,int newvalue){

    if(left<=index && index<=right){

        if(left==right){

            Min[node].value=newvalue;
            return Min[node];

        }

        int middle=(left+right)/2;

        Interval LeftSubTree=Update(2*node,left,middle,index,newvalue);
        Interval RightSubTree=Update(2*node+1,middle+1,right,index,newvalue);

        if(LeftSubTree.value<=RightSubTree.value)

            Min[node]=LeftSubTree;

        else

            Min[node]=RightSubTree;

        return Min[node];

    }

    return Min[node];

}

int main(){

    cin>>n;

    for(int i=1;i<=n;i++)
        cin>>v[i];

    SegmentTree(1,1,n);

    for(int i=1;i<n;i++){

        Interval position=Query(1,1,n,i,n);

        Update(1,1,n,i,position.value);
        Update(1,1,n,position.index,v[i]);

        swap(v[i],v[position.index]);

    }

    for(int i=1;i<=n;i++)
        cout<<v[i]<<' ';

}