Pagini recente » Cod sursa (job #2830717) | Cod sursa (job #579854) | Cod sursa (job #2451932) | Cod sursa (job #797632) | Cod sursa (job #2869583)
#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;
}