#include <cstdio> #include <vector> #include <string> #include <stack> #include <queue> #include <algorithm> #include <map> #include <cmath> #include <set> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair #define pb push_back const int INF = 1 << 30; const double EPS = 1e-12; const int dwa=65536; int d[2*dwa+42]; int znajdz(int x, int y, int l, int p, int w) { if(p<x || y<l) return 0; if(x<=l && p<=y) return d[w]; return max(znajdz(x,y,l,(l+p)/2,2*w), znajdz(x,y,(l+p)/2+1,p,2*w+1)); } void umiesc(int x, int h) { int cur=dwa+x; while(cur) { d[cur]=max(d[cur],h); cur/=2; } } void solve() { for(int i=0; i<2*dwa+10; i++) d[i]=0; int n, w; scanf("%d %d", &n, &w); vector<pair<pii,int> > st(n), kon(n); vi h(n); for(int i=0; i<n; i++) { int x1,x2,y1,y2; scanf("%d %d %d %d", &x1,&y1,&x2,&y2); st[i]=mp(mp(min(x1,x2),abs(y2-y1)),i); h[i]=st[i].fi.se; } for(int i=0; i<n; i++) { int x1,x2,y1,y2; scanf("%d %d %d %d", &x1,&y1,&x2,&y2); kon[i]=mp(mp(min(x1,x2),abs(y2-y1)),i); } sort(st.begin(),st.end()); sort(kon.begin(),kon.end()); vi rkon(n); for(int i=0; i<n; i++) { rkon[kon[i].se]=i; } int ok=1; for(int i=0; i<n; i++) { int cur=st[i].se; if((w-znajdz(rkon[cur],n,0,dwa-1,1)) < h[cur]) ok=0; umiesc(rkon[cur], h[cur]); //printf("ziomus nr %d, na poczatku byl %d, teraz %d, a wysokosc %d\n",cur,i,rkon[cur],h[cur]); } if(ok) printf("TAK\n"); else printf("NIE\n"); } int main() { int t; scanf("%d", &t); while(t--) { solve(); } }
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 | #include <cstdio> #include <vector> #include <string> #include <stack> #include <queue> #include <algorithm> #include <map> #include <cmath> #include <set> using namespace std; typedef long long ll; typedef vector<int> vi; typedef pair<int, int> pii; #define fi first #define se second #define mp make_pair #define pb push_back const int INF = 1 << 30; const double EPS = 1e-12; const int dwa=65536; int d[2*dwa+42]; int znajdz(int x, int y, int l, int p, int w) { if(p<x || y<l) return 0; if(x<=l && p<=y) return d[w]; return max(znajdz(x,y,l,(l+p)/2,2*w), znajdz(x,y,(l+p)/2+1,p,2*w+1)); } void umiesc(int x, int h) { int cur=dwa+x; while(cur) { d[cur]=max(d[cur],h); cur/=2; } } void solve() { for(int i=0; i<2*dwa+10; i++) d[i]=0; int n, w; scanf("%d %d", &n, &w); vector<pair<pii,int> > st(n), kon(n); vi h(n); for(int i=0; i<n; i++) { int x1,x2,y1,y2; scanf("%d %d %d %d", &x1,&y1,&x2,&y2); st[i]=mp(mp(min(x1,x2),abs(y2-y1)),i); h[i]=st[i].fi.se; } for(int i=0; i<n; i++) { int x1,x2,y1,y2; scanf("%d %d %d %d", &x1,&y1,&x2,&y2); kon[i]=mp(mp(min(x1,x2),abs(y2-y1)),i); } sort(st.begin(),st.end()); sort(kon.begin(),kon.end()); vi rkon(n); for(int i=0; i<n; i++) { rkon[kon[i].se]=i; } int ok=1; for(int i=0; i<n; i++) { int cur=st[i].se; if((w-znajdz(rkon[cur],n,0,dwa-1,1)) < h[cur]) ok=0; umiesc(rkon[cur], h[cur]); //printf("ziomus nr %d, na poczatku byl %d, teraz %d, a wysokosc %d\n",cur,i,rkon[cur],h[cur]); } if(ok) printf("TAK\n"); else printf("NIE\n"); } int main() { int t; scanf("%d", &t); while(t--) { solve(); } } |