Cod sursa(job #3252284)

Utilizator n6v26rDedu Razvan Matei n6v26r Data 29 octombrie 2024 00:26:22
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.97 kb
#include <ctime>
#include <stdio.h>
#include <stdlib.h>
 
#define MAXN 3000000
 
int v[MAXN+1];
 
void swap(int *a, int *b){
  int aux = *a;
  *a=*b;
  *b=aux;
}
 
int pivot(int *v, int a, int b, int pi){
 
  int i=a, j=b;
  while(1){
 
    while(v[i]<pi)
      i++;
 
    while(v[j]>pi)
      j--;
 
    if(i>=j){
      return j;
     }
    swap(&v[i], &v[j]);
    i++;
    j--;
  }
}
 
int quickselect(int *v, int k, int a, int b){
 
    if(a==b)
      return v[a];
 
    int pi=pivot(v, a, b, v[a+rand()%(b-a+1)]);
      if(k<=pi){
        return quickselect(v, k, a, pi);
      }
        return quickselect(v, k, pi+1, b);
}
 
int main()
{
  srand(time(NULL));
  int n, k;
    FILE *fin, *fout;
    fin=fopen("sdo.in", "r");
    fscanf(fin, "%d%d\n", &n, &k);
    for(int i=0; i<n; i++){
      fscanf(fin, "%d", &v[i]);
    }
    fclose(fin);
 
    fout=fopen("sdo.out", "w");
    fprintf(fout, "%d\n", quickselect(v, k-1, 0, n-1));
    fprintf(fout, "\n");
    fclose(fout);
    return 0;
}