#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define fi first
#define sc second
#define LL long long
vector<int> Tab;
int divide(int n){
int Rmax = 0, Lmin = Tab[0];
multiset<int> Liczby;
for(int i = 0; i < n; i++){
Rmax = max(Rmax, Tab[i]);
Liczby.insert(Tab[i]);
}
for(int i = 1; i < n; i++){
Liczby.erase(Liczby.lower_bound(Tab[i-1]));
Lmin = min(Lmin, Tab[i-1]);
auto It = Liczby.end(); It--;
Rmax = *It;
// for(auto x : Liczby) cout << x << " ";
// cout << endl;
if(Lmin >= Rmax) return i;
}
return -1;
}
void ct(int isol, int k){
k -= 2;
for(int i = 1; i <= k-1; i++){
cout << i << " ";
}
if(isol > k) cout << isol - 1 << " " << isol << " ";
else if(isol == k) cout << isol << " " << isol+1 << " ";
else cout << k+1 << " " << k+2 << " ";
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int N, k;
cin >> N >> k;
Tab.resize(N);
for(int i = 0; i < N; i++){
int a; cin >> a;
Tab[i] = a;
}
if(k == 2){
int res = divide(N);
if(res == -1){
cout << "NIE" << endl;
}
else{
cout << "TAK" << endl;
cout << res << endl;
}
return 0;
}
else{
int n = N; int isol = -1; int brak = N;
priority_queue<pair<int, int>> Q;
for(int i = 0; i < N; i++){
Q.push(make_pair(Tab[i], -i));
}
// if(-Q.top().sc != N-1){
// isol = -Q.top().sc; isol++;
// ct(isol, k);
// }
while(!Q.empty() && -Q.top().sc == n-1){
Q.pop();
n--;
}
if(Q.empty()){
cout << "NIE" << endl;
return 0;
}
brak = n;
if(brak != N) k--;
isol = -Q.top().sc; isol++;
if(k == 2){
if(divide(n) == -1) cout << "NIE" << endl;
else{
cout << "TAK" << endl;
cout << divide(n) << " " << brak << endl;
}
}
else{
cout << "TAK" << endl;
ct(isol, k);
if(brak != N) cout << brak << " " << endl;
}
}
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 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define fi first #define sc second #define LL long long vector<int> Tab; int divide(int n){ int Rmax = 0, Lmin = Tab[0]; multiset<int> Liczby; for(int i = 0; i < n; i++){ Rmax = max(Rmax, Tab[i]); Liczby.insert(Tab[i]); } for(int i = 1; i < n; i++){ Liczby.erase(Liczby.lower_bound(Tab[i-1])); Lmin = min(Lmin, Tab[i-1]); auto It = Liczby.end(); It--; Rmax = *It; // for(auto x : Liczby) cout << x << " "; // cout << endl; if(Lmin >= Rmax) return i; } return -1; } void ct(int isol, int k){ k -= 2; for(int i = 1; i <= k-1; i++){ cout << i << " "; } if(isol > k) cout << isol - 1 << " " << isol << " "; else if(isol == k) cout << isol << " " << isol+1 << " "; else cout << k+1 << " " << k+2 << " "; } int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); int N, k; cin >> N >> k; Tab.resize(N); for(int i = 0; i < N; i++){ int a; cin >> a; Tab[i] = a; } if(k == 2){ int res = divide(N); if(res == -1){ cout << "NIE" << endl; } else{ cout << "TAK" << endl; cout << res << endl; } return 0; } else{ int n = N; int isol = -1; int brak = N; priority_queue<pair<int, int>> Q; for(int i = 0; i < N; i++){ Q.push(make_pair(Tab[i], -i)); } // if(-Q.top().sc != N-1){ // isol = -Q.top().sc; isol++; // ct(isol, k); // } while(!Q.empty() && -Q.top().sc == n-1){ Q.pop(); n--; } if(Q.empty()){ cout << "NIE" << endl; return 0; } brak = n; if(brak != N) k--; isol = -Q.top().sc; isol++; if(k == 2){ if(divide(n) == -1) cout << "NIE" << endl; else{ cout << "TAK" << endl; cout << divide(n) << " " << brak << endl; } } else{ cout << "TAK" << endl; ct(isol, k); if(brak != N) cout << brak << " " << endl; } } return 0; } |
English