#include <cstdio> #include <algorithm> #include <cmath> #include <vector> #include <queue> #define s(x); scanf("%d",&x); using namespace std; int cars, height; vector <int> h,special,tree; priority_queue <pair<int,int > > QS,QK; struct four{ int a,b,c,d; }; void fix(int k){ while(k>=1){ k = k>>1; tree[k] = max(tree[k*2],tree[(k*2)+1]); } return; } void change(int x, int k){ tree[x+(1<<16)] = max(tree[x+(1<<16)],k); fix(x+(1<<16)); } int maximal(int x, int y, int p, int k, int w){ if(x==p&&y==k) return tree[w]; if(x >= ((p+k)>>1)) return maximal(x,y,((p+k)>>1),k,(w*2)+1); else if( y < ((p+k)>>1)) return maximal(x,y,p,((p+k)>>1),w*2); else return max(maximal(x,((p+k)>>1),p,((p+k)>>1),(w*2)),maximal(((p+k)>>1),y,((p+k)>>1),k,(w*2)+1)); } void czysc(){ cars = 0; height = 0; h.clear(); special.clear(); tree.clear(); tree.resize(1<<17,0); while(!QS.empty()) QS.pop(); while(!QK.empty()) QK.pop(); return; } void read_start(){ for(int i = 0; i < cars; i++){ four k; s(k.a); s(k.b); s(k.c); s(k.d); h[i] = abs(k.b-k.d); QS.push(make_pair(-max(k.a,k.c),i)); } return; } void read_end(){ for(int i = 0; i < cars; i++){ four k; s(k.a); s(k.b); s(k.c); s(k.d); QK.push(make_pair(-max(k.a,k.c),i)); } return; } void star(){ for(int i = 0; i < cars; i++){ int a; a = QK.top().second; QK.pop(); special[a] = i; } return; } bool ending(){ while(!QS.empty()){ int a = QS.top().second; QS.pop(); int mini = maximal(special[a]+(1<<16),1<<17,1<<16,1<<17,1) + h[a]; if(mini>height) return false; else change(special[a],h[a]); } return true; } void double_star(bool k){ if(k) printf("TAK\n"); else printf("NIE\n"); return; } void solve(){ czysc(); s(cars); s(height); h.resize(cars+1,0); special.resize(cars+1,0); read_start(); read_end(); star(); double_star(ending()); return; } int main(){ int t; s(t); while(t--) 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 124 | #include <cstdio> #include <algorithm> #include <cmath> #include <vector> #include <queue> #define s(x); scanf("%d",&x); using namespace std; int cars, height; vector <int> h,special,tree; priority_queue <pair<int,int > > QS,QK; struct four{ int a,b,c,d; }; void fix(int k){ while(k>=1){ k = k>>1; tree[k] = max(tree[k*2],tree[(k*2)+1]); } return; } void change(int x, int k){ tree[x+(1<<16)] = max(tree[x+(1<<16)],k); fix(x+(1<<16)); } int maximal(int x, int y, int p, int k, int w){ if(x==p&&y==k) return tree[w]; if(x >= ((p+k)>>1)) return maximal(x,y,((p+k)>>1),k,(w*2)+1); else if( y < ((p+k)>>1)) return maximal(x,y,p,((p+k)>>1),w*2); else return max(maximal(x,((p+k)>>1),p,((p+k)>>1),(w*2)),maximal(((p+k)>>1),y,((p+k)>>1),k,(w*2)+1)); } void czysc(){ cars = 0; height = 0; h.clear(); special.clear(); tree.clear(); tree.resize(1<<17,0); while(!QS.empty()) QS.pop(); while(!QK.empty()) QK.pop(); return; } void read_start(){ for(int i = 0; i < cars; i++){ four k; s(k.a); s(k.b); s(k.c); s(k.d); h[i] = abs(k.b-k.d); QS.push(make_pair(-max(k.a,k.c),i)); } return; } void read_end(){ for(int i = 0; i < cars; i++){ four k; s(k.a); s(k.b); s(k.c); s(k.d); QK.push(make_pair(-max(k.a,k.c),i)); } return; } void star(){ for(int i = 0; i < cars; i++){ int a; a = QK.top().second; QK.pop(); special[a] = i; } return; } bool ending(){ while(!QS.empty()){ int a = QS.top().second; QS.pop(); int mini = maximal(special[a]+(1<<16),1<<17,1<<16,1<<17,1) + h[a]; if(mini>height) return false; else change(special[a],h[a]); } return true; } void double_star(bool k){ if(k) printf("TAK\n"); else printf("NIE\n"); return; } void solve(){ czysc(); s(cars); s(height); h.resize(cars+1,0); special.resize(cars+1,0); read_start(); read_end(); star(); double_star(ending()); return; } int main(){ int t; s(t); while(t--) solve(); return 0; } |