Cod sursa(job #977886)

Utilizator andrettiAndretti Naiden andretti Data 26 iulie 2013 22:55:41
Problema Statistici de ordine Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include<stdio.h>
#include<algorithm>
#include<cstdio>
#include<ctime>
#define maxn 3000005
using namespace std;

int n,k;
int a[maxn];

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

int position(int left,int right)
{
    int i=left,j=right;
    int pivot=rand()%(right-left)+left;
    swap(a[left],a[pivot]);

    while(i<j)
    {
        while(a[i]<=a[j] && i<j) j--;
        if(a[i]>a[j]) swap(a[i],a[j]),i++;
        while(a[i]<=a[j] && i<j) i++;
        if(a[i]>a[j]) swap(a[i],a[j]),j--;
    }
    return i;
}

void quick(int left,int right)
{
    if(left==right) return;
    int p=position(left,right);

    if(p==k) printf("%d",a[p]);
    else
     if(k<p) quick(left,p-1);
     else quick(p+1,right);
}

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

    srand(time(NULL));
    read();
    quick(1,n);

    fclose(stdin);
    fclose(stdout);
    return 0;
}