Cod sursa(job #2869583)

Utilizator vlad.ulmeanu30Ulmeanu Vlad vlad.ulmeanu30 Data 11 martie 2022 17:44:53
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.21 kb
#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pli pair<ll,int>
#define pil pair<int,ll>
#define fi first
#define se second
#define inf (INT_MAX/2-1)
#define infl (1LL<<61)
#define vi vector<int>
#define vl vector<ll>
#define pb push_back
#define sz(a) ((int)(a).size())
#define all(a) begin(a),end(a)
#define y0 y5656
#define y1 y7878
#define aaa system("pause");
#define dbg(x) std::cerr<<(#x)<<": "<<(x)<<'\n',aaa
#define dbga(x,n) std::cerr<<(#x)<<"[]: ";for(int _=0;_<n;_++)std::cerr<<x[_]<<' ';std::cerr<<'\n',aaa
#define dbgs(x) std::cerr<<(#x)<<"[stl]: ";for(auto _:x)std::cerr<<_<<' ';std::cerr<<'\n',aaa
#define dbgp(x) std::cerr<<(#x)<<": "<<x.fi<<' '<<x.se<<'\n',aaa
#define dbgsp(x) std::cerr<<(#x)<<"[stl pair]:\n";for(auto _:x)std::cerr<<_.fi<<' '<<_.se<<'\n';aaa
#define maxn 3000000

using namespace std;

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

int v[maxn+5];

int kth(int l, int r, int k) {
  if (l == r) return v[l];

  int piv = l + rand() % (r-l+1);
  int i, j;

  int maiMici = 0;
  for (i = l; i <= r; i++)
    if (v[i] < v[piv]) maiMici++;

  if (maiMici+1 == k) return v[piv];

  swap(v[piv], v[l+maiMici]);
  piv = l+maiMici;

  ///acum pivotul ales original este pe aceeasi pozitie pe care ar fi daca v[l..r] ar fi
  ///sortat crescator. din configuratia v[l..r] sortat crescator se poate ajunge in
  ///config actuala doar prin interschimbarea de perechi (X, Y), l <= X < piv < Y <= r.
  ///l ...X2 .. X1 .. X3 .. piv .. Y1 .. Y3 .. Y2 .. r. pot interschimba orice X cu orice Y.

  i = l;
  j = r;
  while (i < piv && j > piv) {
    while (i < piv && v[i] < v[piv]) i++;
    while (j > piv && v[j] >= v[piv]) j--;

    if (i < piv && j > piv) {
      swap(v[i], v[j]);
    }
  }

  ///acum orice elem din stanga lui piv este < v[piv], iar orice din dreapta lui este >= v[piv].
  if (maiMici+1 < k) return kth(piv+1, r, k-maiMici-1);
  return kth(l, piv-1, k);
}

int main() {
  int n, k; fin >> n >> k;

  int i, j, z;
  for (i = 1; i <= n; i++) {
    fin >> v[i];
  }

  srand(time(NULL));
  fout << kth(1, n, k);

  fin.close();
  fout.close();

  return 0;
}