#include <cstdio>
#include <vector>
using namespace std;
#define FOR(i,a,b) for(int i=(a);i<(b);++i)
#define FORD(i,a,b) for(int i=(b)-1;i>=(a);--i)
#define REP(i,n) FOR(i,0,n)
#define REPD(i,n) FORD(i,0,n)
#define VAR(v,w) __typeof(w) v=(w)
#define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it)
#define PB push_back
#define INT(x) int x; scanf("%d", &x)
typedef vector<int> VI;
int a[500000], mi[500000], ma[500000];
bool c[500000];
int main() {
INT(n);
INT(k);
REP(i,n) scanf("%d", &a[i]);
bool asc = 1;
int x = 0;
REP(i,n-1) if (a[i] >= a[i + 1]) {
x = i;
asc = 0;
break;
}
if (asc) {
printf("NIE\n");
return 0;
}
if (k == 2) {
mi[0] = 2000000000;
FOR(i,1,n) mi[i] = min(mi[i - 1], a[i - 1]);
ma[n - 1] = a[n - 1];
REPD(i,n-1) ma[i] = max(ma[i + 1], a[i]);
FOR(i,1,n) if (mi[i] >= ma[i]) {
printf("TAK\n%d\n", i);
return 0;
}
printf("NIE\n");
return 0;
}
VI v;
if (k == 3) {
x = -1;
FOR(i,1,n) if (a[i] <= a[0]) {
x = i;
break;
}
if (x < 0) REPD(i,n-1) if (a[i] >= a[n - 1]) {
x = i;
break;
}
if (x < 0) {
printf("NIE\n");
return 0;
}
v.PB(x);
v.PB(x + 1);
} else {
v.PB(x);
v.PB(x + 1);
v.PB(x + 2);
}
FORE(it,v) if (*it > 0 && *it < n) {
c[*it] = 1;
--k;
}
v.clear();
--k;
FOR(i,1,n) {
if (!k) break;
if (!c[i]) {
c[i] = 1;
--k;
}
}
printf("TAK\n");
bool start = 1;
FOR(i,1,n) if (c[i]) {
if (!start) printf(" ");
start = 0;
printf("%d", i);
}
printf("\n");
}
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 | #include <cstdio> #include <vector> using namespace std; #define FOR(i,a,b) for(int i=(a);i<(b);++i) #define FORD(i,a,b) for(int i=(b)-1;i>=(a);--i) #define REP(i,n) FOR(i,0,n) #define REPD(i,n) FORD(i,0,n) #define VAR(v,w) __typeof(w) v=(w) #define FORE(it,c) for(VAR(it,(c).begin());it!=(c).end();++it) #define PB push_back #define INT(x) int x; scanf("%d", &x) typedef vector<int> VI; int a[500000], mi[500000], ma[500000]; bool c[500000]; int main() { INT(n); INT(k); REP(i,n) scanf("%d", &a[i]); bool asc = 1; int x = 0; REP(i,n-1) if (a[i] >= a[i + 1]) { x = i; asc = 0; break; } if (asc) { printf("NIE\n"); return 0; } if (k == 2) { mi[0] = 2000000000; FOR(i,1,n) mi[i] = min(mi[i - 1], a[i - 1]); ma[n - 1] = a[n - 1]; REPD(i,n-1) ma[i] = max(ma[i + 1], a[i]); FOR(i,1,n) if (mi[i] >= ma[i]) { printf("TAK\n%d\n", i); return 0; } printf("NIE\n"); return 0; } VI v; if (k == 3) { x = -1; FOR(i,1,n) if (a[i] <= a[0]) { x = i; break; } if (x < 0) REPD(i,n-1) if (a[i] >= a[n - 1]) { x = i; break; } if (x < 0) { printf("NIE\n"); return 0; } v.PB(x); v.PB(x + 1); } else { v.PB(x); v.PB(x + 1); v.PB(x + 2); } FORE(it,v) if (*it > 0 && *it < n) { c[*it] = 1; --k; } v.clear(); --k; FOR(i,1,n) { if (!k) break; if (!c[i]) { c[i] = 1; --k; } } printf("TAK\n"); bool start = 1; FOR(i,1,n) if (c[i]) { if (!start) printf(" "); start = 0; printf("%d", i); } printf("\n"); } |
English