Cod sursa(job #1884150)

Utilizator 1475369147896537415369Andrei Udriste 1475369147896537415369 Data 18 februarie 2017 14:41:33
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include<cstdio>
#include<ctime>
#include<algorithm>
using namespace std;

int N, K, myArray[1 << 22];

int RandomizedLomutoPartition(int sequence[], int left, int right)
{
    int index = left + rand() % (right - left + 1);
    int pivot = sequence[index];

    swap(sequence[index], sequence[right]);
    index = right;
    int i = left - 1;

    for(int j = left; j < right; j++){
        if(sequence[j] <= pivot){
            i++;
            swap(sequence[i], sequence[j]);
        }
    }
    swap(sequence[i+1], sequence[index]);
    return i + 1;
}
int OrderStatistic(int sequence[], int left, int right, int k){

    while(1){
        int position = RandomizedLomutoPartition(sequence, left, right);
        if(position + 1 == k) return sequence[position];
        else if(k < position) right = position - 1;
        else if(k > position) left = position + 1;
    }
}

int main() {

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

scanf("%d %d", &N, &K);

for(int i = 0; i < N; i++){
    scanf("%d", &myArray[i]);
}srand(time(NULL));

printf("%d", OrderStatistic(myArray, 0, N - 1, K));

return 0;
}