Cod sursa(job #829044)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 4 decembrie 2012 20:22:38
Problema Statistici de ordine Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <cstdio>
#include <ctime>
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

ifstream in("sdo.in");
ofstream out("sdo.out");

void swap( int&a, int&b ){
  int c=a;
  a=b;
  b=c;
}

int partition( int* A, int left, int right ){
  if( left==right )
    return left;
  int r=left+rand()%(right-left);
  swap(A[r],A[right]);
  int x = A[right];
  int i = left - 1;
  for( int j = left; j <= right - 1; j++ ){
    if( A[j] < x ){
      i++;
      swap(A[i],A[j]);
    }
  }
  swap(A[i+1],A[right]);
  return i+1;
}


int main( int argc, char* argv[] ){

    srand( (unsigned)time(NULL));
    int N = 0, k = 0;
    in >> N >> k;
    int* v = new int[N+1];

    for( int i = 1; i <= N; i++ )
      in >> v[i];
    in.close();
    int left = 1, right = N, q = 0;

    // iterative mode
    do{
      q = partition( v, left, right );
      if( k < q )
    right = q - 1;
      else if ( k > q )
    left = q + 1;
    }while( q != k );

    out << v[k]<<endl;
    out.close();
    delete []v;
    return 0;
}