Cod sursa(job #2563396)

Utilizator Bulboaca_EugenBulboaca Alexandru Eugen Bulboaca_Eugen Data 1 martie 2020 11:15:22
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.09 kb
#include <bits/stdc++.h>
using namespace std;
#define zero(x) (x & (-x))
ifstream fin("sdo.in");
ofstream fout("sdo.out");
const int  MAXN = 3 * 1e6 + 3;
int v[MAXN], aux[MAXN], n,  ans;
int generator(int st, int dr){
    return ((rand() >> 14) + rand()) % (dr - st + 1) + st;
}
void nth_elem(int st, int dr, int k){
    if(dr - st <= 0 ) {
        ans = (dr + st) / 2;
        return;
    }
    int pivot = generator(st, dr), cnt = 0, l = st, copie = 0;
    for(int i = st; i <= dr; ++i)
        if(v[i] <= v[pivot] and i != pivot)
            aux[l++] =  v[i], cnt ++;
    aux[l] = v[pivot];
    copie = l++;
    for(int i = st; i <= dr; ++i)
        if(v[i] > v[pivot]) aux[l++] = v[i];
    if(cnt + 1 == k){
        ans = pivot;
        return;
    }
    for(int i = st; i <= dr; ++i)
        v[i] = aux[i], aux[i] = 0;
    if(cnt >= k ) nth_elem(st, copie - 1, k );
    else nth_elem(copie + 1, dr, k - cnt - 1);
}
int main(){
    int k; fin >> n >> k;
    for(int i = 1; i <= n; ++i){
        fin >> v[i];
    }
    nth_elem(1, n, k);
    fout << v[ans];
    return 0;
}