Cod sursa(job #2183482)

Utilizator robx12lnLinca Robert robx12ln Data 23 martie 2018 10:43:51
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include<cstdio>
#include<algorithm>
#include<ctime>
#include<stdlib.h>
using namespace std;
FILE * fin = fopen( "sdo.in", "r" );
FILE * fout= fopen( "sdo.out", "w" );
int pos, N, V[(1<<22)], K;
const int Sz = (1<<20);
char buffer[Sz];
inline void citeste( int &numar ){
    numar = 0;
    while( buffer[pos] < '0' || buffer[pos] > '9' ){
        pos++;
        if( pos == Sz )
            pos = 0, fread( buffer, 1, Sz, fin );
    }
    while( buffer[pos] >= '0' && buffer[pos] <= '9' ){
        numar = numar * 10 + ( buffer[pos] - '0' );
        pos++;
        if( pos == Sz )
            pos = 0, fread( buffer, 1, Sz, fin );
    }
    return;
}
int poz( int L, int R ){
    int ds = 0, dd = -1, aux;
    while( L < R ){
        if( V[L] > V[R] ){
            swap( V[L], V[R] );
            aux = ds;
            ds = -dd;
            dd = -aux;
        }
        L += ds;
        R += dd;
    }
    return L;
}
void solve( int st, int dr, int k ){
    if( st == dr )
        return;
    int p = poz( st, dr );
    int t = p - st + 1;
    if( t >= k )
        solve( st, p - 1, k );
    else
        solve( p + 1, dr, k - t );
}
int main(){
    citeste( N );
    citeste( K );
    for( int i = 1; i <= N; i++ )
        citeste( V[i] );
    srand( time(0) );
    for( int i = N; i >= 2; i-- ){
        int P = 1 + ( (int)( 1 + rand() % i ) * (int)( 1 + rand() % i ) ) % i;
        swap( V[P], V[i] );
    }
    solve( 1, N, K );
    fprintf( fout, "%d\n", V[K] );
    return 0;
}