Cod sursa(job #1829364)

Utilizator Coroian_DavidCoroian David Coroian_David Data 14 decembrie 2016 20:47:41
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <ctime>

using namespace std;

FILE *f, *g;

int n, v[3000001];

int mid, k;

void readFile()
{
    f = fopen("sdo.in", "r");

    fscanf(f, "%d%d", &n, &k);

    int i;

    for(i = 1; i <= n; i ++)
        fscanf(f, "%d", &v[i]);

    fclose(f);
}

void nthElement(int st, int dr)
{
    int i, j, aux;

    int piv = (st + dr) / 2;

    i = st;
    j = dr;

    do
    {
        while(i < dr && v[i] < v[piv])
            i ++;

        while(j > st && v[j] > v[piv])
            j --;

        if(i <= j)
        {
            aux = v[i];

            v[i] = v[j];

            v[j] = aux;

            i ++;

            j --;
        }
    }
    while(i <= j);

    if(k < dr && k > piv)
        nthElement(i, dr);

    else
        if(k > st && k < piv)
            nthElement(st, j);
}

void mix()
{
    srand(time(0));

    int i, j, aux;

    for (i = n; i >= 1; i --)
    {
        j = 1 + rand() % i;

        aux = v[i];

        v[i] = v[j];

        v[j] = aux;
    }
}

void solve()
{
    mix();

   nthElement(1, n);

   mid = v[k];

//    mid = nth_element();
}

void printFile()
{
    g = fopen("sdo.out", "w");

    fprintf(g, "%d\n", mid);

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}