Cod sursa(job #1011446)

Utilizator PsychoAlexAlexandru Buicescu PsychoAlex Data 16 octombrie 2013 20:54:16
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.71 kb
#include <iostream>
#include <fstream>

std::ifstream fin("sdo.in");
std::ofstream fout("sdo.out");

struct nod
{
    int val = 0;
    nod *st, *dr;
};
nod *varf = new nod;

int n, p, position, a[3000001];

//void change(int &a, int &b)
//{
//    int aux = a;
//    a = b;
//    b = aux;
//}
//
//void poz(int in, int sf, int &k)
//{
//    int i1 = 1, j1 = 0;
//    while(in < sf)
//    {
//        if(a[in] > a[sf])
//        {
//            change(a[in], a[sf]);
//
//            if(i1 == 1)
//            {
//                i1 = 0;
//                j1 = -1;
//            }
//            else
//            {
//                i1 = 1;
//                j1 = 0;
//            }
//        }
//
//        in += i1;
//        sf += j1;
//    }
//    k = in;
//}
//
//void QSort(int in, int sf)
//{
//    int k;
//    if(in < sf)
//    {
//        poz(in, sf, k);
//        if(k > p-1)
//        {
////            QSort(in, k-1);
//            QSort(k+1, sf);
//        }
//        else
//            if(k < p-1)
//            {
//                QSort(in, k-1);
//            }
////            else
////            {
////                position = k;
////                return;
////            }
//    }
//}

void addInTree(nod *cur, int val)
{
    if(cur->val != 0)
    {
        if(cur->val > val)
        {
            addInTree(cur->st, val);
        }
        else
        {
            addInTree(cur->dr, val);
        }
    }
    else
    {
        cur->val = val;
        cur->st = new nod;
        cur->dr = new nod;
    }
}

void citire()
{
    fin>>n>>p;
    fin>>a[0];
    varf->val = a[0];
    varf->st = new nod;
    varf->dr = new nod;
    for(int i = 1; i < n; i++)
    {
        fin>>a[i];
        addInTree(varf, a[i]);
    }
}
bool done = false;
void parsing(nod *cur, int &k)
{
    if(cur->val != 0 && !done)/// && k < p)
    {
        parsing(cur->st, k);
        if(k == p)
        {
            fout<<cur->val<<'\n';
            k++;
            done = true;
            return;
        }
        else
            if(done)
            {
                return;
            }
//        std::cout<<k<<' '<<p<<"; "<<cur->val<<'\n';
        k++;
        if(!done)
        {
            parsing(cur->dr, k);
//            k++;
        }
    }
//    else
//        if(k == p)
    {
//        std::cout<<cur->val<<' ';
//        k++;
    }
}

void rezolvare()
{
    int u = 1;
    parsing(varf, u);
//    QSort(0, n-1);
//    for(int i = 0; i < n; i++)
//    {
//        std::cout<<a[i]<<' ';
//    }
//    std::cout<<'\n'<<a[p - 1]<<'\n';
}

int main()
{
    citire();
    rezolvare();
    return 0;
}