Cod sursa(job #1693356)

Utilizator gabrielinelusGabriel-Robert Inelus gabrielinelus Data 22 aprilie 2016 22:26:06
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1 kb
#include <bits/stdc++.h>

#define Nmax 3000005
using namespace std;
int N,K;
int v[Nmax];

void Read()
{
    scanf("%d%d",&N,&K);
    for(int i = 1; i <= N; ++i)
        scanf("%d",&v[i]);
    srand(unsigned(time(0)));
}

void Part(int li,int lf, int piv, int &st,int &dr)
{///  ( [li,st-1] < )  ( [st,dr] = ) ( [dr+1,lf] > )
    swap(v[piv],v[lf]);
    int p = li;
    for(int i = li; i < lf; ++i)
        if(v[i] < v[lf])
            swap(v[p++],v[i]);
    st = p;
    for(int i = st; i < lf; ++i)
        if(v[i] == v[lf])
            swap(v[p++],v[i]);
    swap(v[lf],v[p]);
    dr = p;
}

void quicks(int li,int lf,int &pz)
{
    int piv = li + rand() % (lf - li + 1);
    int st,dr;
    Part(li,lf,piv,st,dr);
    if(pz < st)
        quicks(li,st,pz);
    else
        if(pz > dr)
            quicks(dr,lf,pz);
}

int main()
{
    freopen("sdo.in","r",stdin);
    freopen("sdo.out","w",stdout);

    Read();
    quicks(1,N,K);
    printf("%d\n",v[K]);

    return 0;
}