Cod sursa(job #1313293)

Utilizator eneandradaEne Oana-Andrada eneandrada Data 10 ianuarie 2015 15:30:11
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.14 kb
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

ifstream f("sdo.in");
ofstream g("sdo.out");

long i,n,k,j,pozitie,v[3000000];

long part(long s, long d)
{
    i=s-1; j=d+1;
    long pivot=v[s+rand()%(d-s+1)]; //pivot aleator
    while(i<j)
    {
        while(pivot>v[i])
            i++;
        while(pivot<v[j])
            j--;
        if(i<j)
            { swap(v[i],v[j]); i++; j--; }
    }
    return i;
}

void sord(long v[], long s, long d, long k)
{
    if(s==d)
        {pozitie=k; return;}
    long poz=part(s,d); //da pozitia pivotului aleator
    long t=poz-s+1; //elemente intre capatul din stanga al intervalului si pozitia pivotului (incluzand pivotul)
    if(t>k) //elementul cautat se afla in subvectorul din stanga
        sord(v,s,poz,k);
        else if (t>k)//elementul cautat se afla in subvectorul din dreapta
            sord(v,poz,d,k-t); //din k scad cate elemente sunt in stanga
            else
                {pozitie=poz+1; return;}
}

int main()
{
    f>>n>>k;
    for(i=1;i<=n;i++)
        f>>v[i];
    sord(v,1,n,k);
    g<<v[pozitie];
    return 0;
}