Cod sursa(job #1822389)

Utilizator emanuel_rRamneantu Emanuel emanuel_r Data 4 decembrie 2016 20:13:39
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include<iostream>
#include<fstream>
#include<cstdlib>
#include<ctime>
#include<cstdio>

using namespace std;

ofstream g("sdo.out");

int const NMax = 3000000, Buffer_Size = 100000;
int V[NMax];
int n, k, pos;
char Buffer[Buffer_Size];

void read(int & nr)
{
    nr = 0;
    while(Buffer[pos] < '0' || Buffer[pos] > '9'){
        pos++;
        if(pos == Buffer_Size){
            fread(Buffer, 1, Buffer_Size, stdin);
            pos = 0;
        }
    }
    while(Buffer[pos] >= '0' && Buffer[pos] <= '9'){
        nr = nr*10 + Buffer[pos++] - '0';
        if(pos == Buffer_Size){
            fread(Buffer, 1, Buffer_Size, stdin);
            pos = 0;
        }
    }
}

void Read()
{
    freopen("sdo.in", "r", stdin);
    fread(Buffer, 1, Buffer_Size, stdin);

    read(n); read(k);
    for(int i=1; i<=n; i++)
        read(V[i]);
}

int Split(int left, int right, int pivot)
{
    int i, smaller;

    smaller = left;
    swap(V[right], V[pivot]);
    for(i = left; i < right; i++)
        if(V[i] < V[right])
            swap(V[i], V[smaller++]);

    swap(V[right], V[smaller]);
    return smaller;
}

void Solve()
{
    int pivot, i, j, left, right, mid;

    left = 1;
    right = n;
    srand (time(NULL));

    while(true){
        pivot = (rand() % (right - left + 1)) + left;
        mid = Split(left, right, pivot);
        if(mid == k)
            break;
        if(mid < k)
            left = mid + 1;
        else
            right = mid - 1;
    }

    g<<V[k];
}

int main()
{
    Read();
    Solve();
    return 0;
}