Cod sursa(job #2824389)

Utilizator mircea_007Mircea Rebengiuc mircea_007 Data 2 ianuarie 2022 00:29:40
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.91 kb
#include <stdio.h>
#include <ctype.h>

// hoare quick select

#define MAXN 3'000'000

int v[MAXN];

class ReadOnSteroids {
  protected:
    static const int BUFSIZE = (128 * 1024);
    FILE *fin;
    char ibuf[BUFSIZE];
    int ibp = BUFSIZE - 1;
    bool close;

  public:
    ReadOnSteroids( char *fname ){
      fin = fopen( fname, "r" );
      close = true;
    }
    
    ReadOnSteroids( FILE *fp ){
      fin = fp;
      close = false;
    }
    
    ~ReadOnSteroids(){
      if( close )
        fclose( fin );
    }

    #pragma GCC diagnostic push
    #pragma GCC diagnostic ignored "-Wunused-result"
    
    inline char getch(){
      if( (ibp = ((ibp + 1) & (BUFSIZE - 1))) == 0 )
        fread( ibuf, sizeof(char), BUFSIZE, fin );
     return ibuf[ibp];
    }
    
    #pragma GCC diagnostic pop

    template<typename T> inline T getnum(){
      T n = 0;
      char ch, semn = 1;
      
      while( isspace( ch = getch() ) );
      if( ch == '-' ){
        ch = getch();
        semn = -1;
      }
      do
        n = n * 10 + ch - '0';
      while( isdigit( ch = getch() ) );
      
      return n * semn;
    }
};

void qselect( int begin, int end, int k ){
  int b = begin - 1, e = end + 1, p = v[(begin + end) / 2], aux;
  
  if( begin == end )
    return;
  
  while( v[++b] < p );
  while( v[--e] > p );
  
  while( b < e ){
    aux = v[b];
    v[b] = v[e];
    v[e] = aux;
    
    while( v[++b] < p );
    while( v[--e] > p );
  }
  
  //if( begin < e )
  //  myqsort(begin, e);
  //if( e + 1 < end )
  //  myqsort(e + 1, end);
  
  if( k > e )
    qselect( e + 1, end, k );
  else
    qselect( begin, e, k );
}

int main(){
  ReadOnSteroids fin( (char *)"sdo.in" );
  FILE *fout = fopen("sdo.out", "w");

  int n, k, i;
  
  n = fin.getnum<int>();
  k = fin.getnum<int>() - 1;
  for( i = 0 ; i < n ; i++ )
    v[i] = fin.getnum<int>();
  
  qselect( 0, n - 1, k );
  
  fprintf(fout, "%d\n", v[k]);

  fclose(fout);
  return 0;
}