Cod sursa(job #1790022)

Utilizator robx12lnLinca Robert robx12ln Data 27 octombrie 2016 18:21:14
Problema Statistici de ordine Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<ctime>
#define DIM 30000
using namespace std;
FILE * fin = fopen("sdo.in","r");
FILE * fout = fopen("sdo.out","w");
int n, k, v[3000005];
char buffer[DIM + 5];
int pos = 0;
void citeste( int &numar ){
    numar = 0;
    while( buffer[pos] < '0' || buffer[pos] > '9' ){
        if( pos == DIM ){
            pos = 0;
            fread( buffer, 1, DIM, fin );
        }
        pos++;
    }
    while( buffer[pos] >= '0' && buffer[pos] <= '9' ){
        numar = numar * 10 + (int)( buffer[pos] - '0' );
        if( pos == DIM ){
            pos = 0;
            fread( buffer, 1, DIM, fin );
        }
        pos++;
    }
    return ;
}
int poz( int st, int dr ){
    int i = 0;
    int j = -1;
    while( st < dr ){
        if( v[st] > v[dr] ){
            swap( v[st], v[dr] );
            int aux = i;
            i = -j;
            j = -aux;
        }
        st += i;
        dr += j;
    }
    return st;
}
int sdo( int st, int dr ){
    if( st < dr ){
        int p = poz( st, dr );
        if( p == k ){
            return p;
        }else{
            if( k < p ){
                sdo( st, p );
            }else{
                sdo( p + 1, dr );
            }
        }
    }
}
int main(){
    fread( buffer, 1, DIM, fin );
    citeste(n);
    citeste(k);
    for( int i = 1; i <= n; i++ ){
        citeste(v[i]);
    }
    srand( time(0) );
    for( int i = 2; i <= n; i++ ){
        int p =  ( rand() % (i - 1) ) + 1;
        swap( v[p], v[1] );
    }
    int p = sdo( 1, n );
    fprintf( fout, "%d", v[p] );
    return 0;
}