Cod sursa(job #2101219)

Utilizator MrRobotMrRobot MrRobot Data 6 ianuarie 2018 23:40:47
Problema Sortare prin comparare Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 2.85 kb
#include <iostream>
#include <fstream>
#include <limits.h>
using namespace std;

ifstream fin("algsort.in");
ofstream fout("algsort.out");

#define dim 500001

struct numere
{
    int val, poz;
} v[dim], minim[2*dim]; //poz[50001];;
int poz_min; //pozitia minimului in vectorul v

numere comp(numere a, numere b)
{
    if(a.val <= b.val)
        return a;
    else
        return b;
}

numere create(int nod, int l, int r)
{
    if(r==l) //dc suntem in frunza
    {
        minim[nod].val = v[l].val;
        minim[nod].poz = v[l].poz;
        //poz_min = l;
        //cout<<v[l];
        //v[l] = INT_MAX;
        return v[l];
    }
    //else -> dc suntem in nod interior
    int mid = (l+r)/2;  //in caz de overflow: l+(r-l)2;
    numere val1 = create(2*nod, l, mid);
    numere val2 = create(2*nod+1, mid+1, r);
    //minim[nod] = val1>val2? val1 : val2; - time limit caca maca
    minim[nod] = comp(val1, val2);
    return minim[nod];
}

void update(int nod, int l, int r, int ind, int val)
{
    if(r==l)
    {
        v[l].val = val;
        //poz_min = l;
        minim[nod].val=val;
        minim[nod].poz=l;
        //cout<<v[l];
        //v[l] = INT_MAX;
    }
    else
    {
        int mid = l+(r-l)/2;
        if(ind <= mid)
            update(2*nod, l, mid, ind, val);
        else
            update(2*nod+1, mid+1, r, ind, val);
        //minim[nod] = minim[2*nod] > minim[2*nod+1]? minim[2*nod] : minim[2*nod+1];
        minim[nod] = comp(minim[2*nod], minim[2*nod+1]);
    }

}

void afisare(int n)
{
    int i;
    cout<<"minim[i]: "<<endl;
    for(i=1; i<=4*n; i++)
        cout<<minim[i].val<<" ";
}

/*int query(int nod, int l, int r, int st, int dr)
//l, r capetele intervalului de care este raspunzator nodul
//st, dr capetele intervalului din cerinta
{
    if(l>=st && r<=dr)
        return minim[nod];
    else
        if(r<st || l>dr)
            return 0;
        //else

    int mid = (l+r)/2;
    int val1 = query(2*nod, l, mid, st, dr);
    int val2 = query(2*nod +1, mid+1, r, st, dr);
    //return val1>val2? val1: val2;
    return min(val1, val2);
}*/

int main()
{
    int n, i;
    fin>>n;
    for(i=1; i<=n; i++)
    {
        fin>>v[i].val;
        v[i].poz = i;
    }

    //afisare(n);
    //cout<<endl;

    numere nr_sort = create(1, 1, n);
    for(i=1; i<=n; i++)
    {
        //cout<<"nr_sort.val: "<<minim[1].val<<" "<<endl;

        //afisare(n);
        //cout<<endl;

        //cout<<"v[i]: "<<endl;
        //for(int j=1; j<=n; j++)
        //    cout<<v[j].val<<" ";
        //cout<<endl;

        fout<<minim[1].val<<" ";
        update(1, 1, n, minim[1].poz, INT_MAX);


        //fout<<minim[1]<<" ";
        //update(1, 1, n, poz_min, INT_MAX);
        //cout<<minim[1]<<" ";
        //update(1, 1, n, poz_min, INT_MAX );
    }
}