Cod sursa(job #2599618)

Utilizator CharacterMeCharacter Me CharacterMe Data 11 aprilie 2020 16:40:09
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.86 kb
#include <bits/stdc++.h>

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

int n, k;
int nums[3000005];

int sdo(int lft, int rgt);
int position(int lft, int rgt);

int main()
{

    srand(time(0));
    fin >> n >> k;
    for(int i = 1; i <= n; ++i) fin >> nums[i];

    fout << sdo(1, n);

    return 0;
}

int sdo(int lft, int rgt){
    int p = position(lft, rgt);

    if(k == p) return nums[p];
    else if(k < p) return sdo(lft, p - 1);
    else return sdo(p + 1, rgt);
}

int position(int lft, int rgt){
    int pl = 0, pr = 1;

    int pos = rand() % (rgt - lft + 1) + lft;
    swap(nums[lft], nums[pos]);

    while(lft < rgt){
        if(nums[lft] > nums[rgt]){
            swap(pl, pr);
            swap(nums[lft], nums[rgt]);
        }

        lft += pl;
        rgt -= pr;
    }

    return lft;
}