Cod sursa(job #855833)

Utilizator mihaitza_1993Fieraru Mihai mihaitza_1993 Data 15 ianuarie 2013 18:09:45
Problema Statistici de ordine Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <fstream>
#include <time.h>
#include <stdlib.h>

using namespace std;

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

int a[3000010];

int partition(int a[], int p, int q)
{
    int x, i, j, aux;
    x=a[p];
    j=p;
    for(i=p+1;i<=q;i++)
        if(a[i]<x)
        {
            j++;
            aux=a[i];
            a[i]=a[j];
            a[j]=aux;
        }
    aux=a[p];
    a[p]=a[j];
    a[j]=aux;
    return j;
}

int mysecpartition(int a[], int p, int q)
{
    int s,pivot,aux;
    s=q-p+1;
    srand(time(NULL));
    pivot=p+(rand()%s);
    aux=a[pivot];
    a[pivot]=a[1];
    a[1]=aux;
    return partition(a,p,q);
}

int select(int a[], int p, int q, int i)
{
    int x,k;
    if(p==q) return a[p];
    x=mysecpartition(a,p,q);
    k=x-p+1;
    if(k==i) return a[x];
    else if(i<k) return select(a,p,x-1,i);
    else return select(a,x+1,q,i-k);
}


int main()
{
    int i,k,n;
    in>>n>>k;
    for(i=1;i<=n;i++) in>>a[i];
    out<<select(a,1,n,k);
 //   out<<mysecpartition(a,1,n);

   // out<<rand()<<" ";
   // srand ( time(NULL) );
   // out<<rand()<<" ";
    return 0;
}