//Wiktor Kotala #include <bits/stdc++.h> #define f first #define s second #define add push_back using namespace std; typedef long long ll; typedef pair<int,int> pint; typedef pair<ll,ll> pll; const int N = 500'005; const int inf = 2'000'000'000; int A[N], B[N]; int minpref[N]; int maxsuf[N]; vector<int> V, odp; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k; pint minEl, maxEl; minEl = {inf, -1}; maxEl = {-inf, -1}; cin >> n >> k; for(int i=1; i<=n; i++){ cin >> A[i]; if(A[i] <= minEl.f) minEl = {A[i], i}; if(A[i] > maxEl.f) maxEl = {A[i], i}; } if(k==2){ minpref[0] = inf; maxsuf[n+1] = -inf; for(int i=1; i<=n; i++){ minpref[i] = min(minpref[i-1], A[i]); maxsuf[n-i+1] = max(maxsuf[n-i+2], A[n-i+1]); } for(int v=1; v<n; v++){ if(minpref[v] >= maxsuf[v+1]){ V.add(v); break; } } } else if(k==3){ if(minEl.f == maxEl.f){ V.add(1); V.add(2); } else if(minEl.s != 1){ V.add(minEl.s-1); V.add(minEl.s); } else if(maxEl.s != n){ V.add(maxEl.s-1); V.add(maxEl.s); } } else{ for(int i=1; i<=n; i++){ B[i] = A[i]; } sort(B+1, B+n+1); for(int i=1; i<n; i++){ if(A[i] == A[i+1]){ V.add(i-1); V.add(i); V.add(i+1); break; } } if(V.empty()){ for(int i=n; i>1; i--){ if(A[i] != B[i]){ V.add(i); break; } } if(!V.empty()){ int v = B[V.front()]; int x; for(int i=V.front()-1; ; i--){ if(A[i] == v){ x = i; break; } } V.add(x); V.add(x-1); } } } if(V.empty()){ cout << "NIE"; } else{ cout << "TAK\n"; for(auto it = V.begin(); it != V.end(); ){ if(*it <= 0 || *it >= n) it = V.erase(it); else it++; } odp = V; for(int i=1; odp.size() < k-1; i++){ if(count(V.begin(), V.end(), i) == 0){ odp.add(i); } } sort(odp.begin(), odp.end()); for(const int& ind : odp){ cout << ind << ' '; } } 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 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 | //Wiktor Kotala #include <bits/stdc++.h> #define f first #define s second #define add push_back using namespace std; typedef long long ll; typedef pair<int,int> pint; typedef pair<ll,ll> pll; const int N = 500'005; const int inf = 2'000'000'000; int A[N], B[N]; int minpref[N]; int maxsuf[N]; vector<int> V, odp; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n,k; pint minEl, maxEl; minEl = {inf, -1}; maxEl = {-inf, -1}; cin >> n >> k; for(int i=1; i<=n; i++){ cin >> A[i]; if(A[i] <= minEl.f) minEl = {A[i], i}; if(A[i] > maxEl.f) maxEl = {A[i], i}; } if(k==2){ minpref[0] = inf; maxsuf[n+1] = -inf; for(int i=1; i<=n; i++){ minpref[i] = min(minpref[i-1], A[i]); maxsuf[n-i+1] = max(maxsuf[n-i+2], A[n-i+1]); } for(int v=1; v<n; v++){ if(minpref[v] >= maxsuf[v+1]){ V.add(v); break; } } } else if(k==3){ if(minEl.f == maxEl.f){ V.add(1); V.add(2); } else if(minEl.s != 1){ V.add(minEl.s-1); V.add(minEl.s); } else if(maxEl.s != n){ V.add(maxEl.s-1); V.add(maxEl.s); } } else{ for(int i=1; i<=n; i++){ B[i] = A[i]; } sort(B+1, B+n+1); for(int i=1; i<n; i++){ if(A[i] == A[i+1]){ V.add(i-1); V.add(i); V.add(i+1); break; } } if(V.empty()){ for(int i=n; i>1; i--){ if(A[i] != B[i]){ V.add(i); break; } } if(!V.empty()){ int v = B[V.front()]; int x; for(int i=V.front()-1; ; i--){ if(A[i] == v){ x = i; break; } } V.add(x); V.add(x-1); } } } if(V.empty()){ cout << "NIE"; } else{ cout << "TAK\n"; for(auto it = V.begin(); it != V.end(); ){ if(*it <= 0 || *it >= n) it = V.erase(it); else it++; } odp = V; for(int i=1; odp.size() < k-1; i++){ if(count(V.begin(), V.end(), i) == 0){ odp.add(i); } } sort(odp.begin(), odp.end()); for(const int& ind : odp){ cout << ind << ' '; } } return 0; } |