#include <cstdio> #include <algorithm> #define MP make_pair #define ST first #define ND second using namespace std; typedef pair<int, int> PII; typedef pair<PII, int> PIII; const int N = 5e4; const int S = 1<<16; int n, h, at[N+1]; PIII a[N+1], b[N+1]; struct tree { int t[2*S]; void set(int p, int v) { t[p += S] = v; while (p /= 2) t[p] = max(t[2*p], t[2*p+1]); }; int get(int a, int b) { int r = 0; a += S-1; b += S+1; while (a+1 < b) { if (a%2==0) r = max(r, t[a+1]); if (b%2==1) r = max(r, t[b-1]); a /= 2; b /= 2; } return r; } } t; void read(PIII t[]) { for (int i=1; i<=n; ++i) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); t[i] = MP(MP(max(x1, x2), abs(y1-y2)), i); } sort(t+1, t+1+n); } int main() { int q; scanf("%d", &q); while (q--) { scanf("%d%d", &n, &h); read(a); read(b); for (int i=1; i<=n; ++i) { t.set(i, a[i].ST.ND); at[a[i].ND] = i; } bool ok = true; for (int i=1; i<=n; ++i) { int p = at[b[i].ND]; ok &= t.get(1, p-1) <= h - a[p].ST.ND; t.set(p, 0); } puts(ok ? "TAK" : "NIE"); } 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 | #include <cstdio> #include <algorithm> #define MP make_pair #define ST first #define ND second using namespace std; typedef pair<int, int> PII; typedef pair<PII, int> PIII; const int N = 5e4; const int S = 1<<16; int n, h, at[N+1]; PIII a[N+1], b[N+1]; struct tree { int t[2*S]; void set(int p, int v) { t[p += S] = v; while (p /= 2) t[p] = max(t[2*p], t[2*p+1]); }; int get(int a, int b) { int r = 0; a += S-1; b += S+1; while (a+1 < b) { if (a%2==0) r = max(r, t[a+1]); if (b%2==1) r = max(r, t[b-1]); a /= 2; b /= 2; } return r; } } t; void read(PIII t[]) { for (int i=1; i<=n; ++i) { int x1, y1, x2, y2; scanf("%d%d%d%d", &x1, &y1, &x2, &y2); t[i] = MP(MP(max(x1, x2), abs(y1-y2)), i); } sort(t+1, t+1+n); } int main() { int q; scanf("%d", &q); while (q--) { scanf("%d%d", &n, &h); read(a); read(b); for (int i=1; i<=n; ++i) { t.set(i, a[i].ST.ND); at[a[i].ND] = i; } bool ok = true; for (int i=1; i<=n; ++i) { int p = at[b[i].ND]; ok &= t.get(1, p-1) <= h - a[p].ST.ND; t.set(p, 0); } puts(ok ? "TAK" : "NIE"); } return 0; } |