Cod sursa(job #977900)

Utilizator andrettiAndretti Naiden andretti Data 26 iulie 2013 23:08:40
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 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(i<j) swap(a[i],a[j]),i++;
        while(a[i]<=a[j] && i<j) i++;
        if(i<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(k<p) quick(left,p-1);
     else
      if(k>p) quick(p+1,right);
}

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

    srand(time(0));
    read();
    quick(1,n);
    printf("%d",a[k]);

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