Cod sursa(job #2277881)

Utilizator danielsociuSociu Daniel danielsociu Data 6 noiembrie 2018 23:02:20
Problema Statistici de ordine Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.91 kb
#include <fstream>
#include <cstdlib>
std::ifstream cin("sdo.in");
std::ofstream cout("sdo.out");
#define maxn 3000005
int n,k,v[maxn];

int getNumber(int,int,int);
int partitie(int,int);


int main()
{
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>v[i];
    cout<<getNumber(k,1,n);
}

int getNumber(int k,int st, int dr){
    if(st>=dr)
        return v[st];
    int poz=partitie(st,dr);
    if(poz-st+1==k)
        return v[poz];
    if(poz>k)
        return getNumber(k,st,poz-1);
    else
        return getNumber(k-poz+st-1,poz+1,dr);
}

int partitie(int st, int dr){
    int pivot=st + rand()%(dr-st+1);
    int i=st-1, aux;
    int x=v[pivot];
    v[pivot]=v[dr];
    v[dr]=x;
    for(int j=st;j<dr;j++)
        if(v[j]<x){
            ++i;
            aux=v[j];
            v[j]=v[i];
            v[i]=aux;
    }
    v[dr]=v[i+1];
    v[i+1]=x;
    return i+1;
}