Cod sursa(job #2225283)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 26 iulie 2018 15:36:00
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include <cstdio>
#include <stdlib.h>
#include <time.h>
#include <cstring>
#include <string>
using namespace std;
int N, K, i, left, right, limleft, limright, p;
int long List[3000005];
int main()
{
    freopen("sdo.in", "r", stdin);
    freopen("sdo.out", "w", stdout);
    srand(time(NULL));
    scanf("%d%d", &N, &K);
    for(i=1; i<=N; i++)scanf("%ld", &List[i]);
    left=limleft=1; right=limright=N;
    while(p!=K){
        p=rand()%(limright-limleft+1)+limleft;
        left=limleft; right=limright;
        while(left<p || right>p){
            while(left<p && List[left]<=List[p])left++;
            while(right>p && List[right]>=List[p])right--;
            if(List[left]>List[right]){
                int aux;
                aux=List[left];
                List[left]=List[right];
                List[right]=aux;
                if(p==left)p=right;
                else if(p==right)p=left;
                if(left<p)left++;
                if(right>p)right--;
            }
        }
        if(K<p)limright=right=p-1;
        if(K>p)limleft=left=p+1;
    }
    printf("%ld", List[K]);
    return 0;
}