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
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int t, n, wys, baza, a, b, c, d, tabl[50009], pr, lw, akt, z, maxi, drze[200009];
vector<pair<int, pair<int, int> > >pocz, kon;
int main()
{
	scanf("%d", &t);
	for(int p=0; p<t; p++)
	{
		scanf("%d %d", &n, &wys);
		pocz.clear();
		kon.clear();
		
		baza=1;
		while(baza<n){
			baza*=2;
		}
		for(int pp=0; pp<=baza*2+10; pp++){drze[pp]=0;}
		for(int pp=1; pp<=n; pp++)
		{
			scanf("%d %d %d %d", &a, &b, &c, &d);
			pocz.push_back(make_pair(a, make_pair(d-b, pp)));
		}
		for(int pp=1; pp<=n; pp++)
		{
			scanf("%d %d %d %d", &a, &b, &c, &d);
			kon.push_back(make_pair(a, make_pair(d-b, pp)));
		}
		sort(pocz.begin(), pocz.end());
		sort(kon.begin(), kon.end());
		for(int pp=0; pp<pocz.size(); pp++)
		{
			akt=baza+pp;
			drze[akt]=pocz[pp].second.first;
			while(akt>0)
			{
				drze[akt]=max(drze[akt], pocz[pp].second.first);
				//printf("%d\n", drze[akt]);
				akt/=2;
			}
			tabl[pocz[pp].second.second]=pp;
		}
		z=0;
		for(int pp=0; pp<kon.size(); pp++)
		{
			lw=pp+baza;
			pr=baza+tabl[kon[pp].second.second]-1;
			maxi=0;
			while(lw<pr)
			{
				maxi=max(maxi, drze[lw]);
				maxi=max(maxi, drze[pr]);
				if(lw%2==0)lw/=2;
				else lw=(lw/2)+1;
				if(pr%2==1)pr/=2;
				else pr=(pr/2)-1;
			}
			if(lw==pr)maxi=max(maxi, drze[lw]);
			//printf("%d\n", maxi);
			if(maxi+kon[pp].second.first>wys)
			{
				z=1;
				break;
			}
			akt=baza+tabl[kon[pp].second.second];
			drze[akt]=0;
			akt/=2;
			while(akt>0)
			{
				drze[akt]=max(drze[akt*2], drze[akt*2+1]);
				akt/=2;
			}
		}
		if(z==0)printf("TAK\n");
		else printf("NIE\n");
	}
	return 0;
}