Cod sursa(job #1283508)

Utilizator thinkphpAdrian Statescu thinkphp Data 5 decembrie 2014 19:39:40
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <cstdio>
#include<cstdlib>
#include<ctime>
#define FIN "sdo.in"
#define FOUT "sdo.out"
#define MAXN 3000005

using namespace std;

typedef unsigned int uint;

uint arr[ MAXN ],

     n,

     k;

void read() {

     uint i;

     freopen(FIN, "r", stdin);

     scanf("%d %d", &n, &k);

     for(i = 1; i <= n; i++) scanf("%d", &arr[ i ]); 

     fclose( stdin );
};

void swap(int i, int j) {

     int aux = arr[ i ] ^ arr[ j ];

         arr[ i ] = aux ^ arr[ i ]; 

         arr[ j ] = aux ^ arr[ j ];
};

int nth_element(int li, int ls) {

     if(li == ls) return arr[ li ];

     int i = li,

         j = ls,

         p = arr[li+(rand()%(ls-li+1))];

         //p = arr[ ( li + ls) >> 1 ]; 
          
         do {

            while(arr[ i ] < p) i++; 

            while(arr[ j ] > p) j--;

            if( i <= j ) {

               swap(i,j); i++; j--;
            }

         } while( i <= j );

         if(j >= k) return nth_element(li, j);

                else 

                    return nth_element(j + 1, ls);
};

int main() {

    read();

    //freopen(FOUT, "w", stdout);

    srand(time(NULL));

    printf("%d", nth_element(1, n));

    fclose( stdout );

    return(0);
};