#include <algorithm> #include <cstdio> #include <vector> int main() { int dni; int przedzialow; int nierosnacy = -1; std::vector<int> przychody; std::vector<int> najmniejsze; std::vector<int> najwieksze; scanf("%d %d", &dni, &przedzialow); przychody.reserve(dni); for (int i=0; i<dni; ++i) { int przychod; scanf("%d", &przychod); przychody.push_back(przychod); if (0 < i && przychod <= przychody[i-1]) { nierosnacy = i; } } if (nierosnacy == -1) { puts("NIE"); return 0; } if (4 <= przedzialow) { puts("TAK"); int koniec_pierwszego = std::min(std::max(0, nierosnacy-2), dni-przedzialow); for (int i = koniec_pierwszego; i < koniec_pierwszego+przedzialow-1; ++i) { fprintf(stdout, "%d ", i+1); } return 0; } if (przedzialow == 3 && przychody[1] <= przychody[0]) { puts("TAK"); fputs("1 2", stdout); return 0; } if (przedzialow == 3 && przychody[dni-1] <= przychody[dni-2]) { puts("TAK"); fprintf(stdout, "%d %d\n", dni-2, dni-1); return 0; } najmniejsze.reserve(dni); najmniejsze.push_back(przychody[0]); for (int i=1; i<dni; ++i) { najmniejsze.push_back(std::min(najmniejsze[i-1], przychody[i])); } najwieksze.resize(dni); najwieksze[dni-1] = przychody[dni-1]; for (int i=dni-2; 0<=i; --i) { najwieksze[i] = std::max(najwieksze[i+1], przychody[i]); } if (przedzialow == 2) { for (int i=0; i<dni-1; ++i) { if (najwieksze[i+1] <= najmniejsze[i]) { puts("TAK"); fprintf(stdout, "%d\n", i+1); return 0; } } puts("NIE"); return 0; } if (przedzialow == 3) { for (int i=1; i<dni-1; ++i) { if (przychody[i] <= najmniejsze[i-1]) { puts("TAK"); fprintf(stdout, "%d %d\n", i-1+1, i+1); //fprintf(stderr, "↓i=%d i=%d", najmniejsze[i-1], przychody[i]); return 0; } if (najwieksze[i+1] <= przychody[i]) { puts("TAK"); fprintf(stdout, "%d %d\n", i-1+1, i+1); //fprintf(stderr, "i=%d ↑i=%d", przychody[i], najwieksze[i+1]); return 0; } } puts("NIE"); return 0; } 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 | #include <algorithm> #include <cstdio> #include <vector> int main() { int dni; int przedzialow; int nierosnacy = -1; std::vector<int> przychody; std::vector<int> najmniejsze; std::vector<int> najwieksze; scanf("%d %d", &dni, &przedzialow); przychody.reserve(dni); for (int i=0; i<dni; ++i) { int przychod; scanf("%d", &przychod); przychody.push_back(przychod); if (0 < i && przychod <= przychody[i-1]) { nierosnacy = i; } } if (nierosnacy == -1) { puts("NIE"); return 0; } if (4 <= przedzialow) { puts("TAK"); int koniec_pierwszego = std::min(std::max(0, nierosnacy-2), dni-przedzialow); for (int i = koniec_pierwszego; i < koniec_pierwszego+przedzialow-1; ++i) { fprintf(stdout, "%d ", i+1); } return 0; } if (przedzialow == 3 && przychody[1] <= przychody[0]) { puts("TAK"); fputs("1 2", stdout); return 0; } if (przedzialow == 3 && przychody[dni-1] <= przychody[dni-2]) { puts("TAK"); fprintf(stdout, "%d %d\n", dni-2, dni-1); return 0; } najmniejsze.reserve(dni); najmniejsze.push_back(przychody[0]); for (int i=1; i<dni; ++i) { najmniejsze.push_back(std::min(najmniejsze[i-1], przychody[i])); } najwieksze.resize(dni); najwieksze[dni-1] = przychody[dni-1]; for (int i=dni-2; 0<=i; --i) { najwieksze[i] = std::max(najwieksze[i+1], przychody[i]); } if (przedzialow == 2) { for (int i=0; i<dni-1; ++i) { if (najwieksze[i+1] <= najmniejsze[i]) { puts("TAK"); fprintf(stdout, "%d\n", i+1); return 0; } } puts("NIE"); return 0; } if (przedzialow == 3) { for (int i=1; i<dni-1; ++i) { if (przychody[i] <= najmniejsze[i-1]) { puts("TAK"); fprintf(stdout, "%d %d\n", i-1+1, i+1); //fprintf(stderr, "↓i=%d i=%d", najmniejsze[i-1], przychody[i]); return 0; } if (najwieksze[i+1] <= przychody[i]) { puts("TAK"); fprintf(stdout, "%d %d\n", i-1+1, i+1); //fprintf(stderr, "i=%d ↑i=%d", przychody[i], najwieksze[i+1]); return 0; } } puts("NIE"); return 0; } return 0; } |