Cod sursa(job #380010)

Utilizator mlazariLazari Mihai mlazari Data 4 ianuarie 2010 17:00:01
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 0.86 kb
#include<stdio.h>
#include<string.h>
#include<stdlib.h>


#define NMAX 3000003

int n,k,i,j,l,r,sol,len,m[NMAX];
bool d;
char pars[1<<16];

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

int randPiv(int l,int r) {
  return l+rand()%(r-l+1);
}

int main() {
  freopen("sdo.in","r",stdin);
  freopen("sdo.out","w",stdout);
  scanf("%d%d\n",&n,&k);
  fgets(pars,1<<16,stdin);
  len=strlen(pars)-1;
  for(i=0,j=0;i<len;i++)
   if(pars[i]<'0' || pars[i]>'9') j++;
   else m[j]=m[j]*10+pars[i]-'0';
  l=1;
  r=n;
  do {
    i=l;
    j=r;
    swap(m[i],m[randPiv(l,r)]);
    d=false;
    while(i<j) {
      if(m[i]>m[j]) {
        swap(m[i],m[j]);
        d=!d;
      }
      if(d) ++i;
      else --j;
    }
    if(i==k) sol=m[k];
    else
     if(k<i) r=i-1;
     else l=i+1;
  } while(!sol);
  printf("%d\n",sol);
  return 0;
}