#include <bits/stdc++.h> using namespace std; #define endl "\n" #define ll long long void solve(){ ll n,k; cin >> n >> k; vector<ll> lista(n, 0); for(auto &el : lista) cin >> el; if(k == 2){ vector<ll> maksOdPrawo(n,0),minOdLewo(n,0); minOdLewo[0] = lista[0]; maksOdPrawo[n-1] = lista[n-1]; for(ll i = 1; i < n; i++){ minOdLewo[i] = min(minOdLewo[i-1], lista[i]); maksOdPrawo[n-1-i] = max(maksOdPrawo[n-i], lista[n-1-i]); } for(ll i = 0; i < n-1; i++){ if(minOdLewo[i] >= maksOdPrawo[i+1]){ cout << "TAK\n"; cout << i+1 << endl; return; } } cout << "NIE\n"; } else if(k == 3){ ll minimum = INT_MAX; for(ll i = 0; i < n-2; i++){ minimum = min(minimum, lista[i]); if(minimum >= lista[i+1]){ cout << "TAK\n"; cout << i+1 << " " << i+2 << endl; return; } } ll maksimum = INT_MIN; for(ll i = n-1; i > 1; i--){ maksimum = max(maksimum, lista[i]); if(maksimum <= lista[i-1]){ cout << "TAK\n"; cout << i-1 << " " << i << endl; return; } } cout << "NIE\n"; } else{ vector<pair<ll,ll>> maksOdLewo(n,{0,0}),minOdPrawo(n,{0,0}); minOdPrawo[n-1] = {n-1, lista[n-1]}; maksOdLewo[0] = {0, lista[0]}; for(ll i = 1; i < n; i++){ if(lista[n-i-1] < minOdPrawo[n-i].second){ minOdPrawo[n-i-1].second = lista[n-i-1]; minOdPrawo[n-i-1].first = n-i-1; } else{ minOdPrawo[n-i-1] = minOdPrawo[n-i]; } if(lista[i] > maksOdLewo[i-1].second){ maksOdLewo[i].second = lista[i]; maksOdLewo[i].first = i; } else{ maksOdLewo[i] = maksOdLewo[i-1]; } // minOdLewo[i] = min(minOdLewo[i-1], lista[i]); // maksOdPrawo[n-1-i] = max(maksOdPrawo[n-i], lista[n-1-i]); } for(ll i = 0; i < n-1; i++){ if(maksOdLewo[i].second >= minOdPrawo[i+1].second){ cout << "TAK\n"; ll cnt=0; vector<ll> wynik = {}; //3 if(maksOdLewo[i].first + 1 == minOdPrawo[i+1].first){ if(maksOdLewo[i].first == 0 && minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); cnt+=1; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1){ cnt++; wynik.push_back(j); } } } else if(maksOdLewo[i].first == 0){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(minOdPrawo[i+1].first+1); cnt+=2; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1){ cnt++; wynik.push_back(j); } } } else if(minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); cnt+=2; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != maksOdLewo[i].first){ cnt++; wynik.push_back(j); } } } else{ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); wynik.push_back(minOdPrawo[i+1].first+1); cnt+=3; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1 && j != maksOdLewo[i].first){ cnt++; wynik.push_back(j); } } } } //4 else{ if(maksOdLewo[i].first == 0 && minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(minOdPrawo[i+1].first); cnt+=2; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } else if(maksOdLewo[i].first == 0){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(minOdPrawo[i+1].first+1); wynik.push_back(minOdPrawo[i+1].first); cnt+=3; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1 && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } else if(minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); wynik.push_back(minOdPrawo[i+1].first); cnt+=3; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != maksOdLewo[i].first && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } else{ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); wynik.push_back(minOdPrawo[i+1].first+1); wynik.push_back(minOdPrawo[i+1].first); cnt+=4; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1 && j != maksOdLewo[i].first && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } } sort(wynik.begin(), wynik.end()); for(auto el : wynik) cout << el << " "; cout << endl; return; } } cout << "NIE\n"; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("input.txt", "r", stdin); solve(); }
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 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 | #include <bits/stdc++.h> using namespace std; #define endl "\n" #define ll long long void solve(){ ll n,k; cin >> n >> k; vector<ll> lista(n, 0); for(auto &el : lista) cin >> el; if(k == 2){ vector<ll> maksOdPrawo(n,0),minOdLewo(n,0); minOdLewo[0] = lista[0]; maksOdPrawo[n-1] = lista[n-1]; for(ll i = 1; i < n; i++){ minOdLewo[i] = min(minOdLewo[i-1], lista[i]); maksOdPrawo[n-1-i] = max(maksOdPrawo[n-i], lista[n-1-i]); } for(ll i = 0; i < n-1; i++){ if(minOdLewo[i] >= maksOdPrawo[i+1]){ cout << "TAK\n"; cout << i+1 << endl; return; } } cout << "NIE\n"; } else if(k == 3){ ll minimum = INT_MAX; for(ll i = 0; i < n-2; i++){ minimum = min(minimum, lista[i]); if(minimum >= lista[i+1]){ cout << "TAK\n"; cout << i+1 << " " << i+2 << endl; return; } } ll maksimum = INT_MIN; for(ll i = n-1; i > 1; i--){ maksimum = max(maksimum, lista[i]); if(maksimum <= lista[i-1]){ cout << "TAK\n"; cout << i-1 << " " << i << endl; return; } } cout << "NIE\n"; } else{ vector<pair<ll,ll>> maksOdLewo(n,{0,0}),minOdPrawo(n,{0,0}); minOdPrawo[n-1] = {n-1, lista[n-1]}; maksOdLewo[0] = {0, lista[0]}; for(ll i = 1; i < n; i++){ if(lista[n-i-1] < minOdPrawo[n-i].second){ minOdPrawo[n-i-1].second = lista[n-i-1]; minOdPrawo[n-i-1].first = n-i-1; } else{ minOdPrawo[n-i-1] = minOdPrawo[n-i]; } if(lista[i] > maksOdLewo[i-1].second){ maksOdLewo[i].second = lista[i]; maksOdLewo[i].first = i; } else{ maksOdLewo[i] = maksOdLewo[i-1]; } // minOdLewo[i] = min(minOdLewo[i-1], lista[i]); // maksOdPrawo[n-1-i] = max(maksOdPrawo[n-i], lista[n-1-i]); } for(ll i = 0; i < n-1; i++){ if(maksOdLewo[i].second >= minOdPrawo[i+1].second){ cout << "TAK\n"; ll cnt=0; vector<ll> wynik = {}; //3 if(maksOdLewo[i].first + 1 == minOdPrawo[i+1].first){ if(maksOdLewo[i].first == 0 && minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); cnt+=1; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1){ cnt++; wynik.push_back(j); } } } else if(maksOdLewo[i].first == 0){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(minOdPrawo[i+1].first+1); cnt+=2; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1){ cnt++; wynik.push_back(j); } } } else if(minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); cnt+=2; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != maksOdLewo[i].first){ cnt++; wynik.push_back(j); } } } else{ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); wynik.push_back(minOdPrawo[i+1].first+1); cnt+=3; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1 && j != maksOdLewo[i].first){ cnt++; wynik.push_back(j); } } } } //4 else{ if(maksOdLewo[i].first == 0 && minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(minOdPrawo[i+1].first); cnt+=2; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } else if(maksOdLewo[i].first == 0){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(minOdPrawo[i+1].first+1); wynik.push_back(minOdPrawo[i+1].first); cnt+=3; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1 && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } else if(minOdPrawo[i+1].first == n-1){ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); wynik.push_back(minOdPrawo[i+1].first); cnt+=3; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != maksOdLewo[i].first && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } else{ wynik.push_back(maksOdLewo[i].first+1); wynik.push_back(maksOdLewo[i].first); wynik.push_back(minOdPrawo[i+1].first+1); wynik.push_back(minOdPrawo[i+1].first); cnt+=4; for(ll j = 1; j < n && cnt < k - 1; j++){ if(j != maksOdLewo[i].first+1 && j != minOdPrawo[i+1].first+1 && j != maksOdLewo[i].first && j != minOdPrawo[i+1].first){ cnt++; wynik.push_back(j); } } } } sort(wynik.begin(), wynik.end()); for(auto el : wynik) cout << el << " "; cout << endl; return; } } cout << "NIE\n"; } } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); //freopen("input.txt", "r", stdin); solve(); } |