#include <cstdio> #include <algorithm> using namespace std; int D[1<<17]; int n,M; void buildTree() { M = 1; while(n > M) M <<= 1; for(int i = 1;i<2*M;i++) D[i] = 0; } void update(int k, int v) { k += M; D[k] = v; k >>= 1; while(k >= 1) { D[k] = max(D[2*k], D[2*k + 1]); k >>= 1; } } int query(int p, int q) { p += M; q += M; int result = 0; while(q > p) { if(p&1) result = max(result, D[p++]); if(!(q&1)) result = max(result, D[q--]); p >>= 1; q >>= 1; } if(p == q) result = max(result, D[p]); return result; } struct car { int x, id, height; car(){} car(int x, int id, int height) : x(x), id(id), height(height) {} }; inline bool operator<(const car &a, const car &b) { return a.x < b.x; } int position[1<<17]; car from[1<<17]; car to[1<<17]; int w; void read() { scanf("%d%d", &n, &w); for(int i = 0;i<n;i++) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &x2, &y1, &y2); from[i] = car(min(x1,x2), i, max(y1,y2) - min(y1,y2)); } for(int i = 0;i<n;i++) { int x1,x2,y1,y2; scanf("%d%d%d%d", &x1, &x2, &y1, &y2); to[i] = car(min(x1,x2), i, max(y1,y2) - min(y1,y2)); } sort(from, from + n); sort(to, to + n); } void getPosition() { for(int i = 0;i<n;i++) position[from[i].id] = i; } bool check(int k) { if(query(position[to[k].id], n-1) > w - to[k].height) return false; update(position[to[k].id], to[k].height); return true; } void solve() { getPosition(); for(int i = 0;i<n;i++) { if(!check(i)) { printf("NIE\n"); return; } } printf("TAK\n"); } int main() { int t; scanf("%d", &t); while(t--) { read(); solve(); } return 0; }
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 118 119 120 121 122 123 | #include <cstdio> #include <algorithm> using namespace std; int D[1<<17]; int n,M; void buildTree() { M = 1; while(n > M) M <<= 1; for(int i = 1;i<2*M;i++) D[i] = 0; } void update(int k, int v) { k += M; D[k] = v; k >>= 1; while(k >= 1) { D[k] = max(D[2*k], D[2*k + 1]); k >>= 1; } } int query(int p, int q) { p += M; q += M; int result = 0; while(q > p) { if(p&1) result = max(result, D[p++]); if(!(q&1)) result = max(result, D[q--]); p >>= 1; q >>= 1; } if(p == q) result = max(result, D[p]); return result; } struct car { int x, id, height; car(){} car(int x, int id, int height) : x(x), id(id), height(height) {} }; inline bool operator<(const car &a, const car &b) { return a.x < b.x; } int position[1<<17]; car from[1<<17]; car to[1<<17]; int w; void read() { scanf("%d%d", &n, &w); for(int i = 0;i<n;i++) { int x1, x2, y1, y2; scanf("%d%d%d%d", &x1, &x2, &y1, &y2); from[i] = car(min(x1,x2), i, max(y1,y2) - min(y1,y2)); } for(int i = 0;i<n;i++) { int x1,x2,y1,y2; scanf("%d%d%d%d", &x1, &x2, &y1, &y2); to[i] = car(min(x1,x2), i, max(y1,y2) - min(y1,y2)); } sort(from, from + n); sort(to, to + n); } void getPosition() { for(int i = 0;i<n;i++) position[from[i].id] = i; } bool check(int k) { if(query(position[to[k].id], n-1) > w - to[k].height) return false; update(position[to[k].id], to[k].height); return true; } void solve() { getPosition(); for(int i = 0;i<n;i++) { if(!check(i)) { printf("NIE\n"); return; } } printf("TAK\n"); } int main() { int t; scanf("%d", &t); while(t--) { read(); solve(); } return 0; } |