Cod sursa(job #825237)

Utilizator ciorile.chioareBogatu Adrian ciorile.chioare Data 27 noiembrie 2012 22:22:18
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#include<ctime>
#include<cstdlib>

void swap(int &a, int &b)
{
        int aux = a;
        a = b;
        b = aux;
}

void afis(int *v, int n)
{
        for(int i = 1; i <= n; ++i)
                fprintf(stderr, "%d ", v[i]);

        fprintf(stderr, "\n");
}

void sdo(int *v, int a, int b, int k)
{
        if(a >= b)
                return;
        int i = a - 1, j = b;
        int p = rand() % (b - a) + a;
        swap(v[p], v[b]);
        p = b;
        while(1) {
                while(v[++i] < v[p]);
                while(v[p] < v[--j]);
                if(i < j)
                        swap(v[i], v[j]);
                else
                        break;
        }
        swap(v[i], v[p]);
        afis(v, b - a);
        if(k < i)
                sdo(v, a, i - 1, k);
        else if(i < k)
                sdo(v, i + 1, b, k);
        else
                return;
}

int main()
{
        srand(time(NULL));

        FILE *in = fopen("sdo.in", "r");
        FILE *out = fopen("sdo.out", "w");

        int n;
        int k;
        fscanf(in, "%d%d", &n, &k);
        int *v = new int[n + 1];
        for(int i = 1; i <= n; ++i)
                fscanf(in, "%d", v + i);


       sdo(v, 1, n, k);
       fprintf(out, "%d\n", v[k]);


        return 0;
}