#include <bits/stdc++.h> uint32_t N, K; int32_t ARR[500'005], PREF_MINI_L[500'005], PREF_MAXI_L[500'005], PREF_MINI_R[500'005], PREF_MAXI_R[500'005]; int32_t MAXI = INT32_MIN; int32_t MINI = INT32_MAX; bool OUTPUT = false; bool X = false; bool CUT[500'005]; void prep(){ PREF_MINI_L[1] = ARR[1]; PREF_MAXI_L[1] = ARR[1]; for (int i = 2; i <= N; ++i){ PREF_MINI_L[i] = std::min(PREF_MINI_L[i - 1], ARR[i]); PREF_MAXI_L[i] = std::max(PREF_MAXI_L[i - 1], ARR[i]); } PREF_MINI_R[N] = ARR[N]; PREF_MAXI_R[N] = ARR[N]; for (int i = N - 1; i > 0; --i){ PREF_MINI_R[i] = std::min(PREF_MINI_R[i + 1], ARR[i]); PREF_MAXI_R[i] = std::max(PREF_MAXI_R[i + 1], ARR[i]); } } int main(){ std::iostream::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); std::cin >> N >> K; for (int i = 1; i <= N; ++i){ std::cin >> ARR[i]; MAXI = std::max(MAXI, ARR[i]); MINI = std::min(MINI, ARR[i]); } prep(); for (int i = 1; i < N; ++i){ if (PREF_MINI_L[i] >= PREF_MAXI_R[i + 1]){ CUT[i] = true; OUTPUT = true; --K; break; } } if (K > 2 && !OUTPUT){ for (int i = 2; i < N; ++i){ if (PREF_MAXI_L[i - 1] <= ARR[i] && ARR[i] >= PREF_MINI_R[i + 1] && ARR[i] == MAXI){ CUT[i - 1] = CUT[i] = true; OUTPUT = true; K -= 2; break; } if (PREF_MINI_L[i - 1] >= ARR[i] && ARR[i] <= PREF_MAXI_R[i + 1] && ARR[i] == MINI){ CUT[i - 1] = CUT[i] = true; OUTPUT = true; K -= 2; break; } } } if (K > 3 && !OUTPUT){ for (int i = 2; i < N - 1; ++i){ if (PREF_MAXI_L[i - 1] <= ARR[i] && ARR[i] >= ARR[i + 1] && ARR[i + 1] <= PREF_MINI_R[i + 2]){ CUT[i - 1] = CUT[i] = CUT[i + 1] = true; OUTPUT = true; K -= 3; break; } if (PREF_MINI_L[i - 1] >= ARR[i] && ARR[i] <= ARR[i + 1] && ARR[i + 1] >= PREF_MAXI_R[i + 2]){ CUT[i - 1] = CUT[i] = CUT[i + 1] = true; OUTPUT = true; K -= 3; break; } } } if (OUTPUT){ --K; std::cout << "TAK\n"; for (int i = 1; i <= N; ++i){ if (K && !CUT[i]){ std::cout << i << " "; --K; } if (CUT[i]) std::cout << i << " "; } } else{ std::cout << "NIE"; } 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 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 | #include <bits/stdc++.h> uint32_t N, K; int32_t ARR[500'005], PREF_MINI_L[500'005], PREF_MAXI_L[500'005], PREF_MINI_R[500'005], PREF_MAXI_R[500'005]; int32_t MAXI = INT32_MIN; int32_t MINI = INT32_MAX; bool OUTPUT = false; bool X = false; bool CUT[500'005]; void prep(){ PREF_MINI_L[1] = ARR[1]; PREF_MAXI_L[1] = ARR[1]; for (int i = 2; i <= N; ++i){ PREF_MINI_L[i] = std::min(PREF_MINI_L[i - 1], ARR[i]); PREF_MAXI_L[i] = std::max(PREF_MAXI_L[i - 1], ARR[i]); } PREF_MINI_R[N] = ARR[N]; PREF_MAXI_R[N] = ARR[N]; for (int i = N - 1; i > 0; --i){ PREF_MINI_R[i] = std::min(PREF_MINI_R[i + 1], ARR[i]); PREF_MAXI_R[i] = std::max(PREF_MAXI_R[i + 1], ARR[i]); } } int main(){ std::iostream::sync_with_stdio(false); std::cin.tie(nullptr); std::cout.tie(nullptr); std::cin >> N >> K; for (int i = 1; i <= N; ++i){ std::cin >> ARR[i]; MAXI = std::max(MAXI, ARR[i]); MINI = std::min(MINI, ARR[i]); } prep(); for (int i = 1; i < N; ++i){ if (PREF_MINI_L[i] >= PREF_MAXI_R[i + 1]){ CUT[i] = true; OUTPUT = true; --K; break; } } if (K > 2 && !OUTPUT){ for (int i = 2; i < N; ++i){ if (PREF_MAXI_L[i - 1] <= ARR[i] && ARR[i] >= PREF_MINI_R[i + 1] && ARR[i] == MAXI){ CUT[i - 1] = CUT[i] = true; OUTPUT = true; K -= 2; break; } if (PREF_MINI_L[i - 1] >= ARR[i] && ARR[i] <= PREF_MAXI_R[i + 1] && ARR[i] == MINI){ CUT[i - 1] = CUT[i] = true; OUTPUT = true; K -= 2; break; } } } if (K > 3 && !OUTPUT){ for (int i = 2; i < N - 1; ++i){ if (PREF_MAXI_L[i - 1] <= ARR[i] && ARR[i] >= ARR[i + 1] && ARR[i + 1] <= PREF_MINI_R[i + 2]){ CUT[i - 1] = CUT[i] = CUT[i + 1] = true; OUTPUT = true; K -= 3; break; } if (PREF_MINI_L[i - 1] >= ARR[i] && ARR[i] <= ARR[i + 1] && ARR[i + 1] >= PREF_MAXI_R[i + 2]){ CUT[i - 1] = CUT[i] = CUT[i + 1] = true; OUTPUT = true; K -= 3; break; } } } if (OUTPUT){ --K; std::cout << "TAK\n"; for (int i = 1; i <= N; ++i){ if (K && !CUT[i]){ std::cout << i << " "; --K; } if (CUT[i]) std::cout << i << " "; } } else{ std::cout << "NIE"; } return 0; } |