Cod sursa(job #1833105)

Utilizator Coroian_DavidCoroian David Coroian_David Data 21 decembrie 2016 17:24:36
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 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)
{
   // if (st >= dr) return;

    int i, j, aux;

    int piv = (dr + st) / 2;//(rand() % dr - st + 1) + st;

    int x = v[piv];

    i = st;
    j = dr;

  //  printf("**%d %d %d\n", piv, v[i], v[j]);

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

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

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

            i ++;
            j --;
        }

       /* printf("************%d %d\n", i, j );

        for(int i2 = 1; i2 <= n; i2 ++)
            printf("%d ", v[i2]);

        printf("\n");*/
    }while(i <= j);


    //nthElement(1, n);



  //  printf("%d %d %d %d\n", k, piv, st, dr);

    if(j > st && k <= j)
       /* printf("-"),*/nthElement(st, j);

    else
        if(i < dr && k >= i)
           /* printf("+"),*/nthElement(i, dr);



}

void mix()
{
    int i, j, aux;

    for (i = n; i >= 1; i --)
    {
        j = 1 + rand() % i;
        aux = v[i];
        v[i] = v[j];
        v[j] = aux;
    }

  /*  for(i = 1; i <= n; i ++)
        printf("%d ", v[i]);

    printf("\n");*/
}

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

    nthElement(1, n);


    /*int i;

    for(i = 1; i <= n; i ++)
        printf("++%d ", v[i]);*/



   //
   // nth_element(v + 1, v + k, v + n + 1);

    mid = v[k];



  /*  for(i = 1; i <= n; i ++)
        printf("%d ", v[i]);

    printf("\n");*/
}

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

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

    fclose(g);
}

int main()
{
    readFile();

    solve();

    printFile();

    return 0;
}