Cod sursa(job #612854)

Utilizator marcelcodreaCodrea Marcel marcelcodrea Data 11 septembrie 2011 13:46:49
Problema Statistici de ordine Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<fstream.h>
#define N 3000005
int A[N];
int n, m;
ifstream f("sdo.in");
ofstream g("sdo.out");

int swap(int i, int j) {
    int aux = A[i];
    A[i] = A[j];
    A[j] = aux;
}
int modul(int no, int d) {
    while(no >= d) {
        no -= d;
    }
    return no;
}
int partition(int l, int r) {
    int randNr = rand() % (r - l + 1);
    swap(l + randNr, r);
    int x = A[r];
    int i = l - 1;
    for(int j = l; j < r; j++) {
        if (A[j] < x) {
            i++;
            swap(i,j);
        }
    }
    swap(i + 1, r);
    return i + 1;
}
int ord_stat(int l, int r, int m) {
    if (l < r) {
        int q = partition(l, r);
        if(q - l + 1 > m) {
            return ord_stat(l, q - 1, m);
        }
        else
         if (q - l + 1 == m) {
             return A[q];
         }
         else
          if(q - l + 1 < m) {
              return ord_stat(q + 1, r, m - q + l - 1);
          }
    }
    else
     return A[l];
}
void read() {
    f >> n >> m;
    for(int i = 1; i <= n; i++) {
        f >> A[i];
    }
}

int main() {
    read();
    g << ord_stat(1, n, m);
}