Cod sursa(job #1732498)

Utilizator xSliveSergiu xSlive Data 21 iulie 2016 19:11:20
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <iostream>
#include <fstream>
#include <random>
#include <stdlib.h>
#include <time.h>
#define NMAX 3000010
using namespace std;

unsigned int partitie(unsigned int *v,unsigned int ii,unsigned int is){
    unsigned int i,j;
    i=ii-1;
    j=is+1;
    int pivot=v[ii];
    while(true){
        do{
            i++;
        }while(v[i]<pivot);
        do{
            j--;
        }while(v[j]>pivot);
        if(i<j)
            swap(v[i],v[j]);
        else return j;
    }
}

unsigned int partitieAleatoare(unsigned int *v,unsigned int ii,unsigned int is){
    srand(time(0));
    unsigned int nr = rand() % (is-ii+1);
    nr+=ii;
    swap(v[nr],v[ii]);
    return partitie(v,ii,is);
}

unsigned int iStatistics(unsigned int *v,unsigned int ii,unsigned int is,unsigned int i){
    if(ii == is)
        return v[ii];
    else{
        int q = partitieAleatoare(v,ii,is);
        int nr = q-ii;
        if(i<=q)   return iStatistics(v,ii,q,i);
        else return iStatistics(v,q+1,is,i);
    }
}

int main()
{
    ifstream f("sdo.in");
    ofstream g("sdo.out");
    unsigned int n,v[NMAX],i;
    cin >> n >> i;
    for(unsigned int i=0;i<n;i++){
        cin >> v[i];
    }
    cout << iStatistics(v,0,n-1,i-1);
    return 0;
}