#include <bits/stdc++.h>
using namespace std;
#define FOR(i,a,b) for(int i = (a); i <= (b); ++i)
#define FORD(i,a,b) for(int i = (a); i >= (b); --i)
#define RI(i,n) FOR(i,1,(n))
#define REP(i,n) FOR(i,0,(n)-1)
#define mini(a,b) a=min(a,b)
#define maxi(a,b) a=max(a,b)
#define pb push_back
#define st first
#define nd second
#define sz(w) (int) w.size()
typedef vector<int> vi;
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<pii, int> para;
const ll inf = 1e18 + 7;
const ll maxN = 1e6 + 5;
const ll MOD = 1e9 + 7;
int n, k, arr[maxN];
vector<int> ans;
bool rosnie() {
RI(i, n - 1) {
if (arr[i] <= arr[i - 1]) return false;
}
return true;
}
void print_ans() {
sort(ans.begin(), ans.end());
for (auto x: ans) cout << x + 1 << " ";
cout << endl;
}
void solve_4() {
cout << "TAK\n";
int which = -1;
RI(i, n - 1) {
if (arr[i] <= arr[i - 1]) {
which = i - 1;
break;
}
}
if (which >= 1) ans.pb(which - 1);
ans.pb(which);
if (which != n - 2) ans.pb(which + 1);
REP(i, n) {
if (ans.size() == k - 1) break;
if (abs(i - which) <= 1) continue;
ans.pb(i);
}
}
int last_minim() {
int minim = MOD;
int ind = -1;
FORD(i, n - 1, 0) {
if (arr[i] < minim) {
minim = arr[i];
ind = i;
}
}
return ind;
}
void solve_3() {
int max_ind = distance(arr, max_element(arr, arr + n));
int min_ind = last_minim();
if (max_ind == n - 1 && min_ind == 0) {
cout << "NIE\n";
exit(0);
}
cout << "TAK\n";
if (max_ind != n - 1) {
ans.pb(max_ind - 1);
ans.pb(max_ind);
return;
}
if (min_ind != 0) {
ans.pb(min_ind - 1);
ans.pb(min_ind);
}
}
void solve_2() {
vector<int> maxim(n);
maxim[n - 1] = arr[n - 1];
FORD(i, n - 2, 0) {
maxim[i] = max(arr[i], maxim[i + 1]);
}
int minim = MOD;
REP(i, n - 1) {
minim = min(minim, arr[i]);
if (minim >= maxim[i + 1]) {
cout << "TAK\n";
ans.pb(i);
return;
}
}
cout << "NIE\n";
exit(0);
}
int main() {
cin >> n >> k;
REP(i, n) cin >> arr[i];
if (rosnie()) {
cout << "NIE\n";
return 0;
}
if (k >= 4) solve_4();
if (k == 3) solve_3();
if (k == 2) solve_2();
print_ans();
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 | #include <bits/stdc++.h> using namespace std; #define FOR(i,a,b) for(int i = (a); i <= (b); ++i) #define FORD(i,a,b) for(int i = (a); i >= (b); --i) #define RI(i,n) FOR(i,1,(n)) #define REP(i,n) FOR(i,0,(n)-1) #define mini(a,b) a=min(a,b) #define maxi(a,b) a=max(a,b) #define pb push_back #define st first #define nd second #define sz(w) (int) w.size() typedef vector<int> vi; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef pair<pii, int> para; const ll inf = 1e18 + 7; const ll maxN = 1e6 + 5; const ll MOD = 1e9 + 7; int n, k, arr[maxN]; vector<int> ans; bool rosnie() { RI(i, n - 1) { if (arr[i] <= arr[i - 1]) return false; } return true; } void print_ans() { sort(ans.begin(), ans.end()); for (auto x: ans) cout << x + 1 << " "; cout << endl; } void solve_4() { cout << "TAK\n"; int which = -1; RI(i, n - 1) { if (arr[i] <= arr[i - 1]) { which = i - 1; break; } } if (which >= 1) ans.pb(which - 1); ans.pb(which); if (which != n - 2) ans.pb(which + 1); REP(i, n) { if (ans.size() == k - 1) break; if (abs(i - which) <= 1) continue; ans.pb(i); } } int last_minim() { int minim = MOD; int ind = -1; FORD(i, n - 1, 0) { if (arr[i] < minim) { minim = arr[i]; ind = i; } } return ind; } void solve_3() { int max_ind = distance(arr, max_element(arr, arr + n)); int min_ind = last_minim(); if (max_ind == n - 1 && min_ind == 0) { cout << "NIE\n"; exit(0); } cout << "TAK\n"; if (max_ind != n - 1) { ans.pb(max_ind - 1); ans.pb(max_ind); return; } if (min_ind != 0) { ans.pb(min_ind - 1); ans.pb(min_ind); } } void solve_2() { vector<int> maxim(n); maxim[n - 1] = arr[n - 1]; FORD(i, n - 2, 0) { maxim[i] = max(arr[i], maxim[i + 1]); } int minim = MOD; REP(i, n - 1) { minim = min(minim, arr[i]); if (minim >= maxim[i + 1]) { cout << "TAK\n"; ans.pb(i); return; } } cout << "NIE\n"; exit(0); } int main() { cin >> n >> k; REP(i, n) cin >> arr[i]; if (rosnie()) { cout << "NIE\n"; return 0; } if (k >= 4) solve_4(); if (k == 3) solve_3(); if (k == 2) solve_2(); print_ans(); return 0; } |
English