Cod sursa(job #3332595)

Utilizator livliviLivia Magureanu livlivi Data 7 ianuarie 2026 19:54:44
Problema Statistici de ordine Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 0.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <random>
#include <ctime>
#include <cassert>

using namespace std;

// https://cplusplus.com/reference/random/mersenne_twister_engine/operator()/
mt19937 rng(time(nullptr));

int nth_elem(vector<int>& v, int st, int dr, int k) {
	if (st >= dr) {
		assert(st == dr && st == k);
		return v[k];
	}

	int pos = st + rng() % (dr - st + 1);
	int p = v[pos];
	swap(v[pos], v[dr]);

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

	swap(v[j], v[dr]);

	if (j == k) {
		return p;
	} else if (j < k) {
		return nth_elem(v, j + 1, dr, k);
	} else {
		return nth_elem(v, st, j - 1, k);
	}
}

int main() {
	ifstream cin("sdo.in");
	ofstream cout("sdo.out");

	int n, k; cin >> n >> k;
	vector<int> v(n);
	for (int i = 0; i < n; i++) {
		cin >> v[i];
	}

	cout << nth_elem(v, 0, n - 1, k - 1) << "\n";
	return 0;
}