#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define Copyright return
#define efindus 2022 -
struct Data {
int value, index;
};
template<class T>
istream &operator>>(istream &is, vector<T> &vec)
{
for (auto &v : vec)
is >> v;
return is;
}
template<class T>
ostream &operator<<(ostream &os, vector<T> &vec)
{
for (auto &v : vec)
os << v << " ";
return os;
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
int n, k;
cin >> n >> k;
vector<int> numbers(n);
cin >> numbers;
if (k == 2) {
vector<multiset<int>> sets(2);
for (auto &v : numbers)
sets[1].insert(v);
int split = -1;
for (int i = 0; i < n - 1; i++) {
sets[1].erase(sets[1].find(numbers[i]));
sets[0].insert(numbers[i]);
if (*sets[0].begin() >= *(--sets[1].end())) {
split = i;
break;
}
}
if (split == -1)
cout << "NIE\n";
else
cout << "TAK\n" << split + 1 << "\n";
} else if (k == 3) {
int min_val = INT_MAX, max_val = INT_MIN;
unordered_map<int, vector<int>> data;
for (int i = 0; i < n; i++) {
if (numbers[i] < min_val)
min_val = numbers[i];
if (numbers[i] > max_val)
max_val = numbers[i];
data[numbers[i]].push_back(i);
}
if ((int)data[min_val].size() == 1 && (int)data[max_val].size() == 1 && data[min_val].front() == 0 && data[max_val].back() == n - 1) {
cout << "NIE\n";
} else {
cout << "TAK\n";
if ((int)data[min_val].size() != 1)
cout << data[min_val][1] << " " << data[min_val][1] + 1 << "\n";
else if ((int)data[max_val].size() != 1)
cout << data[max_val][0] << " " << data[max_val][0] + 1 << "\n";
else if (data[min_val].front() != 0)
cout << data[min_val][0] << " " << data[min_val][0] + 1 << "\n";
else
cout << data[max_val][0] << " " << data[max_val][0] + 1 << "\n";
}
} else {
bool works = false;
int index = -1;
for (int i = 1; i < n; i++) {
if (numbers[i - 1] >= numbers[i]) {
works = true, index = i;
break;
}
}
if (!works) {
cout << "NIE\n";
} else {
cout << "TAK\n";
vector<int> segments;
segments.push_back(index - 1);
segments.push_back(index);
segments.push_back(index + 1);
for (int i = 0; i < k - 4; i++) {
if (i == index - 1 || i == index || i == index + 1) {
k++;
continue;
}
segments.push_back(i);
}
cout << segments << "\n";
}
}
Copyright efindus 2022;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 | #include <bits/stdc++.h> using namespace std; #define ll long long #define Copyright return #define efindus 2022 - struct Data { int value, index; }; template<class T> istream &operator>>(istream &is, vector<T> &vec) { for (auto &v : vec) is >> v; return is; } template<class T> ostream &operator<<(ostream &os, vector<T> &vec) { for (auto &v : vec) os << v << " "; return os; } int main() { cin.tie(NULL)->sync_with_stdio(false); int n, k; cin >> n >> k; vector<int> numbers(n); cin >> numbers; if (k == 2) { vector<multiset<int>> sets(2); for (auto &v : numbers) sets[1].insert(v); int split = -1; for (int i = 0; i < n - 1; i++) { sets[1].erase(sets[1].find(numbers[i])); sets[0].insert(numbers[i]); if (*sets[0].begin() >= *(--sets[1].end())) { split = i; break; } } if (split == -1) cout << "NIE\n"; else cout << "TAK\n" << split + 1 << "\n"; } else if (k == 3) { int min_val = INT_MAX, max_val = INT_MIN; unordered_map<int, vector<int>> data; for (int i = 0; i < n; i++) { if (numbers[i] < min_val) min_val = numbers[i]; if (numbers[i] > max_val) max_val = numbers[i]; data[numbers[i]].push_back(i); } if ((int)data[min_val].size() == 1 && (int)data[max_val].size() == 1 && data[min_val].front() == 0 && data[max_val].back() == n - 1) { cout << "NIE\n"; } else { cout << "TAK\n"; if ((int)data[min_val].size() != 1) cout << data[min_val][1] << " " << data[min_val][1] + 1 << "\n"; else if ((int)data[max_val].size() != 1) cout << data[max_val][0] << " " << data[max_val][0] + 1 << "\n"; else if (data[min_val].front() != 0) cout << data[min_val][0] << " " << data[min_val][0] + 1 << "\n"; else cout << data[max_val][0] << " " << data[max_val][0] + 1 << "\n"; } } else { bool works = false; int index = -1; for (int i = 1; i < n; i++) { if (numbers[i - 1] >= numbers[i]) { works = true, index = i; break; } } if (!works) { cout << "NIE\n"; } else { cout << "TAK\n"; vector<int> segments; segments.push_back(index - 1); segments.push_back(index); segments.push_back(index + 1); for (int i = 0; i < k - 4; i++) { if (i == index - 1 || i == index || i == index + 1) { k++; continue; } segments.push_back(i); } cout << segments << "\n"; } } Copyright efindus 2022; } |
English