Cod sursa(job #2647145)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 3 septembrie 2020 13:48:26
Problema Sortare Scor 35
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <bits/stdc++.h>
#define DIM 5010
using namespace std;

int a[DIM],b[DIM],c[DIM],sol[DIM],poz[DIM];
int n,i,adancime;

void qsort (int poz[], int n, int val1, int val2, int level){

    adancime = max (adancime,level);

    if (n <= 1){
        if (n)
            sol[poz[1]] = val1;
        return;
    }
    int Left[DIM], Right[DIM];

    if (a[n] != b[n] && b[n] != c[n] && a[n] != c[n]){

        /// pivotul o sa fie val1+1;
        sol[poz[b[n]]] = val1+1;
        sol[poz[a[n]]] = val1; /// nu stiu cat de ok e asta??

        Left[1] = poz[a[n]];
        int k = 0;
        for (int i=1;i<=n;i++){
            if (i != a[n] && i != b[n])
                Right[++k] = poz[i];
        }

        qsort (Left,1,val1,val1,level+1);
        qsort (Right,k,val1+2,val2,level+1);

    } else {

        /// doua sunt egale => pot sa am pivotul == val1
        int k = 0;
        if (a[n] == b[n] || a[n] == c[n]){

            sol[poz[a[n]]] = val1;

            for (int i=1;i<=n;i++){
                if (i != a[n])
                    Right[++k] = poz[i];
            }

        } else { /// b[n] == c[n];

            sol[poz[b[n]]] = val1;

            for (int i=1;i<=n;i++){
                if (i != b[n])
                    Right[++k] = poz[i];
            }}

        qsort (Left,0,0,0,level+1);
        qsort (Right,k,val1+1,val2,level+1);
    }

}

int main (){

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

    cin>>n;
    for (i=2;i<=n;i++)
        cin>>a[i]>>b[i]>>c[i];

    for (i=1;i<=n;i++)
        poz[i] = i;

    qsort (poz,n,1,n,1);

    cout<<adancime<<"\n";
    for (i=1;i<=n;i++)
        cout<<sol[i]<<" ";

    return 0;
}