Cod sursa(job #1246585)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 21 octombrie 2014 12:44:01
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.97 kb
#include <stdio.h>
#include <stdlib.h>

#define Nmax 3000005

int v[Nmax];
int n, k;

void read(){
    scanf("%d %d", &n, &k);
    for (int i = 1; i <= n; ++i)
        scanf("%d", &v[i]);
}

void swap(int& a, int& b){
    a = (a + b) - (b = a);
}

int part(int l, int r){
    int i = l - 1;
    int j = r + 1;
    int p = v[( rand() % (r - l + 1) + l)];
    // printf("%d %d\n", l, r);
    
    while(1){

        do{
            ++i;        
        } while (v[i] < p);

        do{
            --j;
        } while (v[j] > p);

        if (i < j)
            swap(v[i], v[j]);
        else
            return j;
    }
    return 0;
}

void solve(int l, int r){
    if (l == r)
        return;
    int q = part(l, r);
    // int t = q - l + 1;

    if (q >= k)
        solve(l, q);
    else
        solve(q + 1, r);
}

int main(){
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);

    read();
    srand(9283475);
    solve(1, n);
    printf("%d\n", v[k]);

    return 0;
}