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
124
125
126
// Wojciech Widomski
#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(NULL);

    int n, k;
    cin >> n >> k;

    vector<int> przych(n);

    for (int i = 0; i < n; i++){
        cin >> przych[i];
    }

    if (k >= 4) {
        // Jak od 4, to trzeba tylko znaleźć jedno zmniejszenie
        bool* przedzialy = new bool[n]();
        bool znaleziono = false;
        int pozostalo = k-1;
        for (int i = 1; i < n; i++) {
            if (przych[i] <= przych[i-1]) {
                przedzialy[i] = true;
                pozostalo--;

                if (i != 1) { // Jeśli to nie jest początek
                    przedzialy[i-1] = true;
                    pozostalo--;
                }
                if (i != n-1) { // Jeśli to nie koniec
                    przedzialy[i+1] = true;
                    pozostalo--;
                }

                znaleziono = true;
                break;
            }
        }

        if (znaleziono) {
            int i = 1;
            while (pozostalo > 0) {
                if (!przedzialy[i]) {
                    przedzialy[i] = true;
                    pozostalo--;
                }
                i++;
            }
            cout << "TAK\n";
            for (int i = 0; i < n; i++) {
                if (przedzialy[i]) {
                    cout << i << " ";
                }
            }
            cout << "\n";
        } else {
            cout << "NIE\n";
        }


    } else if (k == 3) {
        // Jak 3, to trzeba pierwszy znaleźć element niewiększy od początkowego,
        // lub ostatni niemniejszy od końcowego
        int niewiekszy = -1;
        int niemniejszy = -1;

        for (int i = 1; i < n; i++) {
            if (przych[i] <= przych[0]) {
                niewiekszy = i;
                break;
            }
        }
        if (niewiekszy == -1) {
            for (int i = przych.size()-2; i >= 0; i--) {
                if (przych[i] >= przych.back()) {
                    niemniejszy = i;
                    break;
                }
            }
            if (niemniejszy == -1) {
                cout << "NIE\n";
            } else {
                cout << "TAK\n" << niemniejszy << " " << niemniejszy + 1 << "\n";
            }
        } else {
            cout << "TAK\n" << niewiekszy << " " << niewiekszy + 1 << "\n";
        }
    } else {
        // Jak 2, to ma być min po lewej niemniejszy od max po prawej.
        int* max_po_prawej = new int[n];
        max_po_prawej[n-1] = przych[n-1];
        for (int i = przych.size()-2; i >= 0; i--) {
            if (przych[i] > max_po_prawej[i+1]) {
                max_po_prawej[i] = przych[i];
            } else {
                max_po_prawej[i] = max_po_prawej[i+1];
            }
        }

        int min_po_lewej = przych[0];
        int przedzial = -1;
        for (int i = 0; i < n-1; i++) {
            if (przych[i] < min_po_lewej) {
                min_po_lewej = przych[i];
            }

            if (min_po_lewej >= max_po_prawej[i+1]) {
                przedzial = i+1;
                break;
            }
        }

        if (przedzial != -1) {
            cout << "TAK\n" << przedzial << "\n";
        } else {
            cout << "NIE\n";
        }

    }


    return 0;
}