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

using namespace std;

struct lustro{ 
	int sz_min, sz_maks, dl_min, dl_maks;

	//konstruktory
	lustro() {
		sz_min = 0;
		sz_maks = 0;
		dl_min = 0;
		dl_maks = 0;
	}
	lustro( int w, int x, int y, int z ) {
		sz_min = w;
		sz_maks = x;
		dl_min = y;
		dl_maks = z;
	}
};

//czy b zawiera sie w a?
bool zawiera( lustro a, lustro b ) {
	if( b.sz_min >= a.sz_min && b.sz_maks <= a.sz_maks && b.dl_min >= a.dl_min && b.dl_maks <= a.dl_maks )
		return true;
	return false;
}

bool przypadek( ) {
	int w,x,y,z;
	int n, N;
	lustro a, b;
	bool czy;
	
	czy = true;

	scanf( "%d", &n );
	
	N = n-1;
	while( n-- ) {
		scanf( "%d%d%d%d", &w, &x, &y, &z );
		b = lustro( w,x,y,z );
		if( n == N ) { //stan poczatkowy
			a = b;
		}
		if( zawiera(b,a) ) { //jesli nowe jest wieksze i okalajace
			czy = true;
		}
		else if(czy && zawiera(a,b) ) { //jesli stare jest dobre, a nowe sie zawiera w nim
			czy = true;
		}
		else {
			czy = false;
		}
		a = lustro( min(a.sz_min,b.sz_min), max(a.sz_maks,b.sz_maks), min(a.dl_min,b.dl_min), max(a.dl_maks,b.dl_maks) );
	}

	return czy;
}

int main( ) {
	
	int t;
	
	scanf( "%d", &t );
	while( t-- ) {
		if( przypadek( ) ) {
			printf( "TAK\n" );
		}
		else {
			printf( "NIE\n" );
		}
	}
	
	return 0;
}