#include <iostream>
#include <vector>
#include <unordered_set>
#include <algorithm>
using namespace std;
// 分区操作
int partition(vector<int>& vec, int left, int right) {
int pivot = vec[left];
int i = left + 1, j = right;
while (i <= j) {
while (i <= j && vec[i] <= pivot) i++; // 找到第一个大于 pivot 的元素
while (i <= j &&
vec[j] > pivot) j--; // 找到第一个小于等于 pivot 的元素
if (i < j) {
swap(vec[i], vec[j]); // 交换这两个元素
i++, j--;
}
}
swap(vec[left], vec[j]); // 将基准值放到正确的位置
return j; // 返回基准值的索引
}
// 快速选择算法
int findKthSmallest(vector<int>& vec, int left, int right, int k) {
if (left == right) {
return vec[left]; // 如果区间只有一个元素,直接返回
}
// 分区操作
int pivotIndex = partition(vec, left, right);
// 判断是否找到第 k 小的元素
if (pivotIndex == k - 1) {
return vec[pivotIndex];
} else if (pivotIndex < k - 1) {
return findKthSmallest(vec, pivotIndex + 1, right,
k); // 在右半部分递归查找
} else {
return findKthSmallest(vec, left, pivotIndex - 1,
k); // 在左半部分递归查找
}
}
int main() {
int n;
cin >> n;
unordered_set<int> uset;
int num;
for (int i = 0; i < n; i++) {
cin >> num;
uset.insert(num);
}
cin >> num;
// 去重并排序
vector<int> vec(uset.begin(), uset.end());
// 输出第 k 小的数
cout << findKthSmallest(vec, 0, vec.size() - 1, num) << endl;
return 0;
}