Cod sursa(job #1226632)

Utilizator o_micBianca Costin o_mic Data 6 septembrie 2014 16:18:32
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 kb
#include <iostream>
#include <fstream>
#include <cstdlib>
#include <ctime>
#include <algorithm>
#define MAX_LENGTH 3000000

using namespace std;

long long v[MAX_LENGTH];
int n;

void print()
{
    int i;
    for(i = 0 ; i < n ; i++)
        cout << v[i] << " ";
}

long long rselection(int k, int left, int right)
{
    int i, j, pos;
    if(left < right - 1)
    {
        pos = rand() % (right - left) + left;
        swap(v[pos], v[left]);
        for(i = left, j = left + 1 ; j < right ; j++)
            if(v[j] < v[left])
            {
                swap(v[i+1], v[j]);
                i++;
            }
        swap(v[left], v[i]);
        if(i > left + k-1)
            return rselection(k, left, i);
        if(i < left + k-1)
            return rselection(k-i-1+left, i+1, right);
        return v[i];
    }
    return v[left];
}

int main()
{
    int i, k;
    srand(time(NULL));
    fstream f("sdo.in", ios::in);
    fstream g("sdo.out", ios::out);
    f >> n >> k;
    for(i = 0 ; i < n ; i++)
        f >> v[i];
    g << rselection(k, 0, n);
    return 0;
}