Cod sursa(job #1875541)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 11 februarie 2017 11:38:14
Problema Statistici de ordine Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.05 kb
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#define MAX 3000001

using namespace std;
FILE *f1 = fopen("sdo.in", "r");
FILE *f2 = fopen("sdo.out", "w");

int a[MAX], i, n, k;

int selectie_aleatoare(int *a, int l, int r)
{
    int q, p, u;
    q = a[l + rand() % (r - l + 1)];
    p = l - 1;
    u = r + 1;

    while (0 < 1)
    {
        do
        {
            p++;
        }while( a[p] <= q);

        do
        {
            u--;
        }while( a[u] >= q);

        if (p < u) swap(a[p], a[u]);
        else return u;
    }

}

int partitie_aleatoare(int *a, int l, int r, int pos)
{
    int q, res;
    if (l == r) return a[l];
    q = selectie_aleatoare(a, l, r);
    res = q - l + 1;
    if (pos <= res) return partitie_aleatoare(a, l, q, pos);
    return partitie_aleatoare(a, q + 1, r, pos - res);
}

int main()
{
    fscanf(f1, "%d%d", &n, &k);
    for (i = 0; i < n; i++)
        fscanf(f1, "%d", &a[i]);
    fclose(f1);
    fprintf(f2, "%d", partitie_aleatoare(a, 0, n - 1, k));
    return 0;
}