Cod sursa(job #573021)

Utilizator AndrewTheGreatAndrei Alexandrescu AndrewTheGreat Data 5 aprilie 2011 20:09:09
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.94 kb
#include <iostream>
#include <fstream>
#include <time.h>
#include <stdlib.h>

using namespace std;

const int nmax = 3000010;
int N, A[nmax], K;

void read()
{
    ifstream in("sdo.in");
    in>> N >> K;
    for(int i = 1; i <= N; i++)
        in>> A[i];
}

int part(int S, int D)
{
    int p = A[rand() % (D - S + 1) + S];

    int i = S - 1, j = D + 1;
    while(true)
    {
        do{
            ++i;
        }while(A[i] < p);

        do{
            j--;
        }while(A[j] > p);

        if(i < j)
            swap(A[i], A[j]);
        else return j;
    }
    return j;
}


void sel(int S, int D, int k)
{
    if(S == D)
        return;

    int q = part(S, D);
    int R = q - S + 1;

    if(R >= k)
        sel(S, q, k);
    else sel(q + 1, D, k - R);
}

int main()
{
    srand ( time (NULL) );
    read();
    sel(1, N, K);
    ofstream out("sdo.out");
    out << A[K];
    return 0;
}