Cod sursa(job #2670835)

Utilizator Fantastic_Mantudor voicu Fantastic_Man Data 10 noiembrie 2020 18:59:06
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.32 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>
using namespace std;
const int NMAX = 3e6;
int v[NMAX];
int nth_elem ( int n, int k, int v[] ) {
    int start = 0, end = n - 1, ipiv, i, j, pivot, aux;
    while ( start < end ) {
        ipiv = start + rand() % ( end - start );
        pivot = v[ipiv];
        i = start;
        while ( v[i] < pivot )
            i++;
        j = end;
        while ( v[j] > pivot )
            j--;
        while ( i < j ) {
            aux = v[i];
            v[i] = v[j];
            v[j] = aux;
            do i++; while( v[i] < pivot);
            do j--; while( v[j] > pivot);
        }
        if ( k <= j )
            end = j;
        else
            start = j + 1;
    }
    return v[start];
}
FILE *fin;
int get() {
    int nr = 0, ch;
    while ( ! isdigit ( ch = fgetc(fin) ) );
    do {
        nr = nr * 10 + ch - '0';
    } while ( isdigit ( ch = fgetc(fin) ) );
    return nr;
}
int main() {
    FILE * fout;
    int n, k, i;
    fin = fopen ( "sdo.in", "r" );
    n = get(); k = get();
    for ( i = 0; i < n; i++ )
        v[i] = get();
    fclose ( fin );
    fout = fopen ( "sdo.out", "w" );
    srand ( time ( NULL ) );
    fprintf( fout, "%d", nth_elem ( n, k - 1, v ));
    fclose ( fout );
    return 0;
}