Cod sursa(job #2276585)

Utilizator IordachescuAncaFMI Iordachescu Anca Mihaela IordachescuAnca Data 4 noiembrie 2018 21:49:02
Problema Statistici de ordine Scor 50
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.27 kb
#include<fstream>
#include<random>
#include<ctime>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int partitie(int a[], int st, int dr)
{
    int ra=st+rand()%(dr-st+1);
    int rb=st+rand()%(dr-st+1);
    int rc=st+rand()%(dr-st+1);
    if(a[ra]>a[rb])
    {
        swap(ra,rb);
    }
    if(a[ra]>a[rc])
    {
        swap(ra,rc);
    }
    if(a[rb]>a[rc])
    {
        swap(rb,rc);
    }
    int poz=rb;
    swap(a[dr],a[poz]);
    int pivot=a[dr];
    int i=st-1;
    int j=dr+1;
    while(1)
    {
        do
        {
            i++;
        }
        while(a[i]<pivot);
        do
        {
            j--;
        }
        while(a[j]>pivot);
        if(i>=j)
        {
            return j;
        }
        swap(a[i],a[j]);
    }
}
void qs(int a[], int st, int dr,int k)
{
    if(st>=dr)
    {
		return;
    }
    int poz=partitie(a,st,dr);
    int nrth=poz-st+1;
    if(nrth>=k)
    {
        qs(a,st,poz,k);
    }
    else
    {
        qs(a,poz+1,dr,k-nrth);
    }
}
int n,i,a[500005],k;
int main()
{
    fin>>n>>k;
    for(i=1;i<=n;i++)
    {
        fin>>a[i];
    }
    srand(time(NULL));
    qs(a,1,n,k);
    fout<<a[k];
    fin.close();
    fout.close();
    return 0;
}