Cod sursa(job #1601381)

Utilizator bullseYeIacob Sergiu bullseYe Data 15 februarie 2016 21:36:33
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <cstdlib>
#include <ctime>
#define NMAX 3000010
using namespace std;

int n, A[NMAX], k;

void read();
int divide (int, int);
void qsort (int, int);
void result ();

int main(){
    srand(time(NULL));
    read();
    qsort (0, n-1);
    result();
    return 0;
}

void read(){
    FILE*fin=fopen ("sdo.in", "r");
    int i;
    fscanf(fin, "%d %d", &n, &k);
    for (i=0; i<n; ++i)
        fscanf(fin, "%d", &A[i]);
    fclose(fin);
    return;
}

void result (){
    FILE*fout=fopen ("sdo.out", "w");
    fprintf(fout, "%d\n", A[k-1]);
    fclose(fout);
    return;
}

int divide (int st, int dr)
{
    int pivot=A[st + (rand()%(dr-st+1))];
    while (st<dr){//cat timp mai am macar 2 elemente
        while (st<dr && A[dr]>=pivot) --dr;
        A[st]=A[dr];
        while (st<dr && A[st]<=pivot) ++st;
        A[dr]=A[st];
    }
    A[st]=pivot;
    return st;
}

void qsort (int st, int dr){
    int poz;
    poz=divide (st, dr);
    if (poz==k-1) return;
    if (st<poz-1) qsort (st, poz-1);
    if (poz+1<dr) qsort (poz+1, dr);
}