Cod sursa(job #2617760)

Utilizator ReksioCroftOctavian Florin Staicu ReksioCroft Data 22 mai 2020 20:04:56
Problema Statistici de ordine Scor 100
Compilator c-64 Status done
Runda Arhiva educationala Marime 1.52 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <ctype.h>


#define buffSize 1<<17

int v[3000000];
char buffer[buffSize];
int pozBuff = buffSize;
FILE *fin;


char getch() {
    if ( pozBuff == buffSize ) {
        pozBuff = 0;
        fread( buffer, 1, buffSize, fin );
    }
    return buffer[ pozBuff++ ];
}


int scano() {
    char ch = getch();
    while ( isdigit( ch ) == 0 )
        ch = getch();
    int nr = 0;
    while ( isdigit( ch ) != 0 ) {
        nr = nr * 10 + ( ch - '0' );
        ch = getch();
    }
    return nr;
}


int main() {
    srand( time( NULL ) );
    int n, k, i, j, start, stop, aux, pivot;
    FILE *fout;
    fin = fopen( "sdo.in", "r" );
    fout = fopen( "sdo.out", "w" );
    n = scano();
    k = scano() - 1;
    for ( i = 0; i < n; i++ ) {
        v[i] = scano();
    }
    fclose( fin );
    start = 0;
    stop = n - 1;
    while ( start < stop ) {
        i = start;
        j = stop;
        pivot = v[ ( rand() % ( stop - start + 1 ) ) + start ];
        while ( i <= j ) {
            while ( v[ i ] < pivot )
                i++;
            while ( v[ j ] > pivot )
                j--;
            if ( i <= j ) {
                aux = v[ i ];
                v[ i ] = v[ j ];
                v[ j ] = aux;
                i++;
                j--;
            }
        }
        if ( k <= j )
            stop = j;
        else if ( k >= i )
            start = i;
        else
            start = stop = k;
    }
    fprintf( fout, "%d\n", v[ k ] );
    fclose( fout );
    return 0;
}