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
#include <bits/stdc++.h>
using namespace std;
const int BASE = 262144;
int n, t[2*BASE+512];
long long k, wyn1, wyn2, licznik;
vector<int> v;

void dodaj(int x)
{
    int a = x + BASE;
    t[a]++;
    while(t[a] > 1)
    {
        a /= 2;
        t[a] = t[2*a] + t[2*a+1];
    }
}

int zlicz(int x, int y)
{
    int a = x + BASE, b = y + BASE;
    int wynik = t[a];
    if(a != b) wynik += t[b];
    while(a/2 != b/2)
    {
        if(a % 2 == 0) wynik += t[a+1];
        if(b % 2 == 1) wynik += t[b-1];
        a /= 2;
        b /= 2;
    }
    return wynik;
}

int main()
{
    scanf("%d %lld", &n, &k);
    for(int i = 1; i <= n; i++)
    {
        v.push_back(i);
    }
    do
    {
        wyn1 = 0, wyn2 = 0;
        for(int i = 0; i < v.size(); i++)
        {
            if(v[i] != 1) wyn1 += zlicz(1, v[i]-1);
            dodaj(v[i]);
        }
        memset(t, 0, sizeof(t));
        for(int i = v.size() - 1; i >= 0; i--)
        {
            if(v[i] != 1) wyn2 += zlicz(1, v[i]-1);
            dodaj(v[i]);
        }
        memset(t, 0, sizeof(t));
        if(wyn1 == wyn2) licznik++;
        if(licznik == k)
        {
            printf("TAK\n");
            for(int i = 0; i < v.size(); i++) printf("%d ", v[i]);
            printf("\n");
            return 0;
        }
    }
    while(next_permutation(v.begin(), v.end()));
    printf("NIE\n");
    return 0;
}