Cod sursa(job #1497246)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 6 octombrie 2015 15:26:11
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <bits/stdc++.h>

using namespace std;

const int Nmax = 3000000;
const int Buffsize = 4096;

char buff[Buffsize];
int pos = Buffsize;

inline char GetChar()
{
    if ( pos == Buffsize )
    {
        fread(buff, 1, Buffsize, stdin);
        pos = 0;
    }
    return buff[ pos++ ];
}

inline int ReadInt()
{
    register int q = 0;
    char c;

    do
    {
        c = GetChar();
    } while ( !isdigit(c) );
    do
    {
        q = (10 * q) + (c - '0');
        c = GetChar();
    } while ( isdigit(c) );
    return q;
}

int v[Nmax];

inline int xor128()
{
    static int x = 123456789, y = 362436069, z = 521288629, w = 88675123;
    int t = x ^ ( x >> 11 );
    x = y;
    y = z;
    z = w;
    return w = w ^ ( w >> 19 ) ^ ( t ^ ( t >> 8 ) );
}

void quickSelect(int n, int k)
{
    int lo = 0, hi = n - 1, l;

    do
    {
        int pIndex = lo + xor128() % (hi - lo + 1);
        swap(v[hi], v[pIndex]);
        l = lo;
        for ( int i = lo; i < hi; i++ )
        {
            if ( v[i] < v[hi] )
                swap(v[i], v[l++]);
        }
        swap(v[hi], v[l]);

        if ( l < k )
            lo = l + 1;
        else if ( l > k )
            hi = l - 1;
    } while ( l != k );
}

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

    n = ReadInt(); k = ReadInt();
    for ( int i = 0; i < n; i++ )
        v[i] = ReadInt();
    fclose(stdin);

    quickSelect( n, k - 1 );

    printf("%d\n", v[k - 1]);
    fclose(stdout);
    return 0;
}