#pragma GCC optimize ("O3")
#include <bits/stdc++.h>
using namespace std;
#define FOR(i, b, e) for(int i = (b); i < (e); i++)
#define TRAV(x, v) for(auto &x: v)
#define PB push_back
#define SZ(x) ((int)x.size())
#define X first
#define Y second
using ll = long long;
using vi = vector<int>;
using ii = pair<int, int>;
constexpr int INF = 0x3f3f3f3f;
int n;
void wypisz(vi chce, int k) {
vi corr;
TRAV(x, chce) if(0 <= x && x < n - 1) corr.PB(x);
k -= SZ(corr) + 1;
cout << "TAK\n";
FOR(i, 0, n) {
if(find(corr.begin(), corr.end(), i) != corr.end()) cout << i + 1 << ' ';
else if(k > 0) {
cout << i + 1 << ' ';
k--;
}
}
cout << '\n';
}
void solve2(vi vec) {
vi sufMax(SZ(vec) + 1);
for(int i = SZ(vec) - 1; i >= 0; i--) sufMax[i] = max(sufMax[i + 1], vec[i]);
int prefMin = INF;
FOR(i, 0, SZ(vec) - 1) {
prefMin = min(prefMin, vec[i]);
if(prefMin >= sufMax[i + 1]) return wypisz({i}, 2);
}
cout << "NIE\n";
}
void solve3(vi vec) {
int mini = *min_element(vec.begin(), vec.end());
int miniPos = find(vec.begin() + 1, vec.end(), mini) - vec.begin();
if(miniPos != SZ(vec)) return wypisz({miniPos - 1, miniPos}, 3);
int maxi = *max_element(vec.begin(), vec.end());
int maxiPos = find(vec.begin(), vec.end() - 1, maxi) - vec.begin();
if(maxiPos != SZ(vec) - 1) return wypisz({maxiPos - 1, maxiPos}, 3);
cout << "NIE\n";
}
void solve4(vi vec, int k) {
FOR(i, 0, SZ(vec) - 1) if(vec[i] >= vec[i + 1]) return wypisz({i - 1, i, i + 1}, k);
cout << "NIE\n";
}
void solve() {
int k;
cin >> n >> k;
vi vec(n);
TRAV(x, vec) cin >> x;
if(k == 2) solve2(vec);
if(k == 3) solve3(vec);
if(k >= 4) solve4(vec, k);
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
// int tt; cin >> tt;
// FOR(te, 0, tt) {
// // cout << "Case #" << te + 1 << ": ";
// solve();
// }
solve();
return 0;
}
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 | #pragma GCC optimize ("O3") #include <bits/stdc++.h> using namespace std; #define FOR(i, b, e) for(int i = (b); i < (e); i++) #define TRAV(x, v) for(auto &x: v) #define PB push_back #define SZ(x) ((int)x.size()) #define X first #define Y second using ll = long long; using vi = vector<int>; using ii = pair<int, int>; constexpr int INF = 0x3f3f3f3f; int n; void wypisz(vi chce, int k) { vi corr; TRAV(x, chce) if(0 <= x && x < n - 1) corr.PB(x); k -= SZ(corr) + 1; cout << "TAK\n"; FOR(i, 0, n) { if(find(corr.begin(), corr.end(), i) != corr.end()) cout << i + 1 << ' '; else if(k > 0) { cout << i + 1 << ' '; k--; } } cout << '\n'; } void solve2(vi vec) { vi sufMax(SZ(vec) + 1); for(int i = SZ(vec) - 1; i >= 0; i--) sufMax[i] = max(sufMax[i + 1], vec[i]); int prefMin = INF; FOR(i, 0, SZ(vec) - 1) { prefMin = min(prefMin, vec[i]); if(prefMin >= sufMax[i + 1]) return wypisz({i}, 2); } cout << "NIE\n"; } void solve3(vi vec) { int mini = *min_element(vec.begin(), vec.end()); int miniPos = find(vec.begin() + 1, vec.end(), mini) - vec.begin(); if(miniPos != SZ(vec)) return wypisz({miniPos - 1, miniPos}, 3); int maxi = *max_element(vec.begin(), vec.end()); int maxiPos = find(vec.begin(), vec.end() - 1, maxi) - vec.begin(); if(maxiPos != SZ(vec) - 1) return wypisz({maxiPos - 1, maxiPos}, 3); cout << "NIE\n"; } void solve4(vi vec, int k) { FOR(i, 0, SZ(vec) - 1) if(vec[i] >= vec[i + 1]) return wypisz({i - 1, i, i + 1}, k); cout << "NIE\n"; } void solve() { int k; cin >> n >> k; vi vec(n); TRAV(x, vec) cin >> x; if(k == 2) solve2(vec); if(k == 3) solve3(vec); if(k >= 4) solve4(vec, k); } int main() { ios::sync_with_stdio(0); cin.tie(0); // int tt; cin >> tt; // FOR(te, 0, tt) { // // cout << "Case #" << te + 1 << ": "; // solve(); // } solve(); return 0; } |
English