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
#include <bits/stdc++.h>
using namespace std;

const int maxN = 250001, maxTreeSize = 1 << 19;
const long long INF = 1000000000000000000LL;//10^18

struct Tree
{
	int T[maxTreeSize], offset;
	
	void resize(int n)
	{
		for (offset = 1; offset < n; offset *= 2);
		
		for (int i=offset; i<offset+n; i++)
			T[i] = 1;
			
		for (int i=offset-1; i>0; i--)
			T[i] = T[i * 2] + T[i*2+1];	
	}
	
	int query(int a)
	{
		int left = offset, right = offset * 2, v = 1;
		
		while (v < offset)
		{
			if (a <= T[v * 2])
				v *= 2;
				
			else
				a -= T[v * 2], v = v*2+1;
		}
		
		int res = v - offset + 1;
		
		for (; v > 0; v /= 2)
			T[v]--;
			
		return res;
	}
} tree;

vector <long long> a[maxN];

long long npo2(int n)
{	return 1LL * n * (n - 1) / 2;	}

long long get_a(int n, long long k)
{
	if (k < 0 or k > npo2(n))	return 0;
	k = min(k, npo2(n) - k);
	
	if (k >= a[n].size())	return INF;
	return a[n][k];
}

int main()
{
	a[0].push_back(1);
	a[1].push_back(1);

	int n;
	long long k;
	scanf ("%d%lld", &n, &k);
	
	for (int i=2; i<=n; i++)
	{
		a[i].resize(i < 3000 ? 100 : 7);
		a[i][0] = 1;
		long long s = npo2(i)/2+1;
		
		for (int j=1; j<s; j++)
		{			
			a[i][j] = a[i][j - 1] + get_a(i - 1, j) - get_a(i - 1, j - i);
			
			if (a[i][j] >= INF)
			{
				a[i].resize(j);
				break;
			}
		}
	}
	
	if ((n & 2) or get_a(n, npo2(n)/2) < k)
	{
		printf("NIE\n");
		return 0;
	}
	
	printf("TAK\n");
	long long invs = npo2(n) / 2;
	tree.resize(n);

	for (int i=1; i<=n; i++)
	{
		long long v = 0;

		for (int j=max(1LL, invs+1 - npo2(n-i)); true; j++)
		{
			long long d = get_a(n - i, invs - (j - 1));

			if (k <= v + d)
			{
				printf("%d ", tree.query(j));
				k -= v;
				invs -= j - 1;
				break;
			}
			
			v += d;
		}
	}
	
	printf("\n");
	return 0;
}