Cod sursa(job #1806827)

Utilizator aianisAndra Dumitru aianis Data 15 noiembrie 2016 18:34:21
Problema Statistici de ordine Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>
#include <cstdlib>

using namespace std;

const int N=3000001;
int v[N], p;

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

void schimb(int &a, int &b) {
    int r=b;
    b=a;
    a=r;
}

void partitie3(int st, int dr, int &p1, int &p2) {
    int i, j, k, piv=v[dr];
    i=j;
    st=j;
    k=dr-1;
    while(i<=k) {
        if(v[i]<piv) {
            schimb(v[i], v[j]);
            i++;
            j++;
        } else if(v[i]==piv)
            i++;
        else {
            schimb(v[i], v[k]);
            k--;
        }
    }
    k++;
    schimb(v[dr], v[k]);
    p1=j;
    p2=k;
}
void qs(int st, int dr) {
    if(st>=dr)
        return;
    int p1, p2;
    partitie3(st, dr, p1, p2);
    if (p < p1) qs(st, p1-1);
    if (p > p2) qs(p2+1, dr);
}

int main() {
    int i, n, j;
    in>>n>>p;
    for(i=1; i<=n; i++)
        in>>v[i];
    for(i=n; i>=1; i--) {
        j=1+rand()%i;
        schimb(v[i], v[j]);
    }
    qs(1, n);
    out<<v[p];
    return 0;
}