Untitled

 avatar
unknown
plain_text
13 days ago
2.3 kB
4
Indexable
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int findMedian(vector<int> array) {
    sort(array.begin(), array.end());
    return array[array.size() / 2];
}

vector<int> divideArray(vector<int> v) {
    vector<int> medians;
    vector<int> temp;
    for (int i = 0; i < v.size(); i += 1) {
        temp.push_back(v[i]);
        if (temp.size() == 5 || i == v.size() - 1) {
            medians.push_back(findMedian(temp));
            temp.clear();
        }
    }
    return medians;
}

int findNumber(vector<int> &v, int k) {
    if (v.size() - 1 < k) {
        return -1;
    }

    if (v.size() <= 5) {
        sort(v.begin(), v.end());
        return v[k];
    }

    vector<int> medians = divideArray(v);
    int middleElement = findMedian(medians);

    vector<int> smaller, larger;
    int equal = 0;

    for (int num : v) {
        if (num < middleElement) {
            smaller.push_back(num);
        } else if (num > middleElement) {
            larger.push_back(num);
        } else {
            equal++;
        }
    }

    if (k < smaller.size()) {
        return findNumber(smaller, k);
    }
    if (k < smaller.size() + equal) {
        return middleElement;
    }
    return findNumber(larger, k - smaller.size() - equal);
}

int isNumberGood(int num) {
    int count = 0;

    for (int i = 2; i * i <= num; i++) {
        if (num % i == 0) {
            count++;
            while (num % i == 0) {
                num /= i;
            }
        }
    }
    if (num > 1) {
        count++;
    }
    return count;
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int t, n, a, k;
    vector<int> v;

    cin >> t;

    for (int i = 0; i < t; i++) {
        cin >> n;
        for (int j = 0; j < n; j++) {
            cin >> a;
            if (isNumberGood(a) % 2 == 0) v.push_back(a);
        }
        cin >> k;
        if (v.size() - 1 < k) {
            cout << "BRAK DANYCH" << endl;
            v.clear();
            continue;
        }
        int result = findNumber(v, k);
        if (result != -1) cout << result << endl;
        v.clear();
    }

    return 0;
}
Leave a Comment