Cod sursa(job #2024653)

Utilizator SagunistuStrimbu Alexandru Sagunistu Data 20 septembrie 2017 22:56:41
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <fstream>
#include <cstdlib>
#include <algorithm>

using namespace std;

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

int k,n,a[3000005];

void read() {
    fin >> n >> k;
    for(int i = 0; i < n; ++i)
        fin >> a[i];
}

void partit(int l, int r, int &m, int &n) {
    int i,j,k,x,p;
    p = rand() % (r - l) + l;
    x = a[p];
    i = l;
    j = l;
    k = r;
    while(j < k) {
        if(a[j] == x)
            ++j;
        else
        if(a[j] < x) {
            swap(a[j],a[i]);
            ++i;
            ++j;
        }
        else {
            --k;
            swap(a[j],a[k]);
        }
    }
    m = i;
    n = j;
}

int orderstat() {
    int l = 0;
    int r = n;
    int m,n;
    while(true) {
        partit(l,r,m,n);
        if(m <= k && k < n)
            return a[m];
        else
        if(k < m)
            r = m;
        else
            l = n;
    }
}

int main()
{
    read();
    --k;
    fout << orderstat();
    return 0;
}