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
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>

#define PB push_back
#define MP make_pair
#define ST first
#define ND second

using namespace std;

int ilosc;
long long zycie, a, b, c;
bool wynik = true;

vector <pair<pair<long long,long long>,int> > Zle;
vector <pair<pair<long long,long long>,int> > Dobre;
vector <int> Res;

bool comp( pair<pair<long long,long long>,int> A, pair<pair<long long,long long>,int> B)
{
//	if(A.ST.ST == B.ST.ST)
//		return A.ST.ND >= B.ST.ND;
	return A.ST.ND > B.ST.ND;
}
int main()
{
	scanf("%d %d", &ilosc, &zycie);
	for(int i = 1; i <= ilosc; i++)
	{
		scanf("%lld %lld", &a, &b);
		if(b >= a)
			Dobre.PB(MP(MP(a,b),i));
		else
			Zle.PB(MP(MP(a,b),i));
	}
	sort(Dobre.begin(),Dobre.end());
	for(int i = 0; i < Dobre.size(); i++)
	{
		a = Dobre[i].ST.ST;
		b = Dobre[i].ST.ND;
		c = Dobre[i].ND;
		if(a < zycie)
		{
			zycie += b-a;
			Res.PB(c);
		}
		else
			wynik = 0;
	}
	sort(Zle.begin(),Zle.end(),comp);
	for(int i = 0; i < Zle.size(); i++)
	{
		a = Zle[i].ST.ST;
		b = Zle[i].ST.ND;
		c = Zle[i].ND;
		if(a < zycie)
		{
			zycie += b-a;
			Res.PB(c);
		}
		else
			wynik = 0;
	}
	if(!wynik)
		printf("NIE\n");
	else
	{
		printf("TAK\n");
		for(int i = 0; i < ilosc; i++)
			printf("%d ", Res[i]);
	}
}