Cod sursa(job #2623258)

Utilizator SahisttulArsene Marinel Sahisttul Data 2 iunie 2020 20:31:05
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <bits/stdc++.h>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");

int v[3000001], n, k;

int partitie(int v[], int st, int dr)
{
    int pivot = dr, i = st;
    for(int j = st; j < dr; j++)
        if(v[j] < v[pivot])
        {
            swap(v[j], v[i]);
            i++;
        }
    swap(v[pivot], v[i]);
    return i;
}

int random_pivot(int v[], int st, int dr)
{
    int n = rand();
    int pivot = st + n % (dr - st + 1);
    swap(v[pivot], v[dr]);
    return partitie(v, st, dr);
}

int quick_select(int v[], int st, int dr, int k)
{
    if(st == dr)
        return v[st];
    int pivot = random_pivot(v, st, dr);
    int poz = pivot - st + 1;
    if(k <= poz)        ///verificam care partitie il contine pe k
        return quick_select(v, st, pivot, k);
    else
        return quick_select(v, pivot + 1, dr, k - poz);
}

int main()
{
    f >> n >> k;
    for(int i = 1; i <= n; i++)
        f >> v[i];
    g << quick_select(v, 1, n, k);
    return 0;
}


/**
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("sdo.in");
ofstream g("sdo.out");

const int NMAX = 3000001;

int v[NMAX], n, k;

int main()
{
    f >> n >> k;
    for(int i = 1; i <= n; i++)
        f >> v[i];
    nth_element(v + 1, v + k, v + n + 1);
    g << v[k];
    return 0;
}
*/