#include <iostream> #include <cstdio> #include <string> #include <vector> #include <set> #include <map> #include <queue> #include <cmath> #include <algorithm> using namespace std; #define REP(i,a,b) for(int i=(a);i<=(b);++i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define SORT(X) sort(X.begin(),X.end()) #define fi first #define se second struct Tree{ const static int N = 1024*512; int D[1024*1024]; void clear(){ FOR(i,N*2) D[i] = 0; } void dod(int a, int b){ a += N; while(a){ D[a] = max(D[a],b); a /= 2; } } int maks(int a){ a += N; int b = N*2-7; int ans = 0; while(a+1 < b){ ans = max(ans,D[a]); ans = max(ans,D[b]); b = (b-1)/2; a = (a+1)/2; } if(a == b) ans = max(ans,D[b]); return ans; } }X; int G[1000100]; vector<pair<int,int> > Ev; int W[1000100]; vector<pair<int,int> > Tr; void test(){ while(!Ev.empty()) Ev.pop_back(); while(!Tr.empty()) Tr.pop_back(); X.clear(); int n,w; scanf("%d%d",&n,&w); FOR(i,n){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); W[i] = abs(b-d); Ev.pb(mp(min(a,c),i)); } FOR(i,n){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); W[i] = abs(b-d); Tr.pb(mp(min(a,c),i)); } sort(Tr.begin(),Tr.end()); FOR(i,SZ(Tr)) G[Tr[i].se] = i; sort(Ev.begin(),Ev.end()); FOR(q,SZ(Ev)){ int i = Ev[q].se; int tar = G[i]; if(X.maks(tar) + W[i] > w){ printf("NIE\n"); return; } X.dod(tar,W[i]); } printf("TAK\n"); } int main () { int t; scanf("%d",&t); while(t--) test(); }
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 | #include <iostream> #include <cstdio> #include <string> #include <vector> #include <set> #include <map> #include <queue> #include <cmath> #include <algorithm> using namespace std; #define REP(i,a,b) for(int i=(a);i<=(b);++i) #define FORI(i,n) REP(i,1,n) #define FOR(i,n) REP(i,0,int(n)-1) #define mp make_pair #define pb push_back #define pii pair<int,int> #define vi vector<int> #define ll long long #define SZ(x) int((x).size()) #define DBG(v) cerr << #v << " = " << (v) << endl; #define FOREACH(i,t) for (typeof(t.begin()) i=t.begin(); i!=t.end(); i++) #define SORT(X) sort(X.begin(),X.end()) #define fi first #define se second struct Tree{ const static int N = 1024*512; int D[1024*1024]; void clear(){ FOR(i,N*2) D[i] = 0; } void dod(int a, int b){ a += N; while(a){ D[a] = max(D[a],b); a /= 2; } } int maks(int a){ a += N; int b = N*2-7; int ans = 0; while(a+1 < b){ ans = max(ans,D[a]); ans = max(ans,D[b]); b = (b-1)/2; a = (a+1)/2; } if(a == b) ans = max(ans,D[b]); return ans; } }X; int G[1000100]; vector<pair<int,int> > Ev; int W[1000100]; vector<pair<int,int> > Tr; void test(){ while(!Ev.empty()) Ev.pop_back(); while(!Tr.empty()) Tr.pop_back(); X.clear(); int n,w; scanf("%d%d",&n,&w); FOR(i,n){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); W[i] = abs(b-d); Ev.pb(mp(min(a,c),i)); } FOR(i,n){ int a,b,c,d; scanf("%d%d%d%d",&a,&b,&c,&d); W[i] = abs(b-d); Tr.pb(mp(min(a,c),i)); } sort(Tr.begin(),Tr.end()); FOR(i,SZ(Tr)) G[Tr[i].se] = i; sort(Ev.begin(),Ev.end()); FOR(q,SZ(Ev)){ int i = Ev[q].se; int tar = G[i]; if(X.maks(tar) + W[i] > w){ printf("NIE\n"); return; } X.dod(tar,W[i]); } printf("TAK\n"); } int main () { int t; scanf("%d",&t); while(t--) test(); } |