Cod sursa(job #1806836)

Utilizator edi9876Negescu Eduard Mihai edi9876 Data 15 noiembrie 2016 18:39:36
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <fstream>
#include <stdlib.h>

using namespace std;

int v[3000000];

inline void schimb(int &a, int &b) {
    int c = a;
    a = b;
    b = c;
}

int partitie(int st, int dr, int &p1, int &p2) {
    int i, j, piv = v[dr], k;
    i = j = st;
    k = dr - 1;
    while(i <= k) {
        if(v[i] < piv) {
            schimb(v[i], v[j]);
            i++;
            j++;
        } else if(v[i] == piv) i++;
        else {
            schimb(v[i], v[k]);
            k--;
        }
    }
    k++;
    schimb(v[j], v[dr]);
    p1 = j;
    p2 = k;
}

void quickSort(int st, int dr, int k) {
    if(st >= dr)
        return;
    int p1, p2;
    partitie(st, dr, p1, p2);
    if(k < p1)
        quickSort(st, p1 - 1, k);
    if(k > p2)
        quickSort(p2 + 1, dr, k);
}

int main()
{
    ifstream fin("sdo.in");
    ofstream fout("sdo.out");
    int n, k;
    fin >> n >> k;
    for(int i = 0; i < n; i++)
        fin >> v[i];
    for(int i = n - 1; i >= 1; i--) {
        int j = 1 + rand()%i;
        schimb(v[i], v[j]);
    }
    k--;
    quickSort(0, n - 1, k);
    fout << v[k];
    return 0;
}