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
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

typedef long long int lint;

struct Smok
{
	int index;
	int prog, elixir;
	inline int zysk() const { return elixir - prog; }

	struct Cmp
	{
		inline bool operator () ( const Smok& a, const Smok& b )
		{
			return a.prog < b.prog;
		}
	};

	struct Cmp2
	{
		inline bool operator () ( const Smok& a, const Smok& b )
		{
			return a.elixir > b.elixir;
		}
	};
};

int main()
{
	lint n, z;
	cin >> n >> z;

	vector<Smok> zyskowneSmoki;
	vector<Smok> stratneSmoki;

	for (int i = 0; i < n; i++)
	{
		Smok s;
		s.index = i;
		cin >> s.prog >> s.elixir;

		if ( s.zysk() >= 0 )
			zyskowneSmoki.push_back(s);
		else
			stratneSmoki.push_back(s);
	}

	sort(zyskowneSmoki.begin(), zyskowneSmoki.end(), Smok::Cmp());
	sort(stratneSmoki.begin(), stratneSmoki.end(), Smok::Cmp2());

	vector<int> kolejnosc;
	kolejnosc.reserve(n);
	for ( auto it = zyskowneSmoki.begin(), end = zyskowneSmoki.end(); it != end; ++it )
	{
		if (z <= it->prog)
		{
			cout << "NIE";
			return 0;
		}
		z += it->zysk();
		kolejnosc.push_back(it->index);
	}

	for ( auto it = stratneSmoki.begin(), end = stratneSmoki.end(); it != end; ++it )
	{
		if (z <= it->prog)
		{
			cout << "NIE";
			return 0;
		}
		z += it->zysk();
		kolejnosc.push_back(it->index);
	}

	cout << "TAK\n";
	for ( auto it = kolejnosc.begin(), end = kolejnosc.end(); it != end; ++it )
		cout << ( *it + 1 ) << " ";

	return 0;
}