Cod sursa(job #2059978)

Utilizator gundorfMoldovan George gundorf Data 7 noiembrie 2017 19:38:08
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <iostream>
#include <fstream>
#define Nmax 3000002
#include <stdlib.h>
using namespace std;
ifstream fin("sdo.in");
ofstream fout("sdo.out");
int k,ok,v[Nmax];
int pivotare (int s,int d,int v[])
{
    int i,j,randpoz,randpiv;
    randpoz=rand()% (d-s) +s;
    randpiv=v[randpoz];
    swap(v[d],v[randpoz]);

    i=s-1;
    for (j=s;j<d;j++)
        if (v[j]<randpiv)
    {i++;
    swap(v[i],v[j]);

    }

    swap(v[i+1],v[d]);
    return i+1;
}

void QS(int s,int d,int v[])
{
    if (s<d)
    {
        int p=pivotare(s,d,v);

        if (p==k) {fout<<v[k]<<" ";ok=1;return;}//daca pivotul a ajuns exact pe pozitia k il afisez
        else if (k<p) //altfel daca pivotul e pe o pozitie mai mare decat k continui sa sortez doar in stanga, deoarece stiu ca elementele din dreapta sunt deja mai mari decat elementul cautat de mine
        QS(s,p-1,v);
        else
        QS(p+1,d,v);// altfel sortez doar bucata din dreapta , analog cu cazul de mai sus
    }
}

int main()
{
   int n,i;
   fin>>n>>k;
   for (i=1;i<=n;i++)
    fin>>v[i];
   QS(1,n,v);
   if (ok==0)
   fout<<v[k];
    return 0;
}