Cod sursa(job #663034)

Utilizator JohannesJohannes Dragulanescu Johannes Data 17 ianuarie 2012 18:54:55
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 0.92 kb
#include <iostream>
#include <fstream>
#include<cstdlib>
#define MAXN 3000002

using namespace std;

ifstream f("sdo.in");
ofstream g("sdo.out");

int a[MAXN],n,k;

void interschimba(int i,int j)
{
    int aux=a[i];
    a[i]=a[j];
    a[j]=aux;
}

int part(int s,int d)
{
    int i=s-1,j=d+1,pivot=a[s +rand()%(d-s+1)]; // 
    while(1)
    {
        do i++;
        while(a[i]<pivot); // primul el mai mare ca pivotul l to r
 
        do j--;
        while(a[j]>pivot); // primul elem mai mic ca pivotul r to l
        
		if(i<j)
           interschimba(i,j);
        else
        return j; // ordinul elementului ales random
    }
}

void quick(int s,int d,int k)
{
    if(s==d) return; // partitia mai are un elemen
    int m=part(s,d);
    int x;
    x=m-s+1;
    if(x>=k) quick(s,m,k);
    else quick(m+1,d,k-x);
}

int main()
{
    f>>n>>k;
    for(int i=1;i<=n;i++)
        f>>a[i];
    quick(1,n,k);
    g<<a[k]<<"\n";
    return 0;
}