#include <cstdio>
#include <algorithm>
#define MAKS 50010
using namespace std;
int prawy1[MAKS];
int prawy2[MAKS];
int wys[MAKS];
inline int bw(int x){return (x>0?x:-x);}
int kol1[MAKS];
int odwrkol1[MAKS];
int kol2[MAKS];
int drz[MAKS*4];
int LD;
bool cmp1(int a, int b)
{
if(prawy1[a]!=prawy1[b])return prawy1[a]<prawy1[b];
return a<b;
}
bool cmp2(int a, int b)
{
if(prawy2[a]!=prawy2[b])return prawy2[a]<prawy2[b];
return a<b;
}
void wstaw(int v, int x)
{
v+=LD;
drz[v]=x;
v/=2;
while(v>0)
{
drz[v]=max(drz[2*v],drz[2*v+1]);
v/=2;
}
}
int maks(int l, int p)
{
int ret=0;
l+=LD; p+=LD;
while(l<p)
{
if(l%2==0)l/=2;
else
{
ret=max(ret,drz[l]);
l++;
l/=2;
}
if(p%2==1)p/=2;
else
{
ret=max(ret,drz[p]);
p--;
p/=2;
}
}
if(l==p)ret=max(ret,drz[l]);
return ret;
}
int main()
{
int t,n,W;
scanf("%d",&t);
while(t--)
{
scanf("%d %d",&n,&W);
for(int i=0;i<n;i++)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
wys[i]=bw(y1-y2);
prawy1[i]=max(x1,x2);
}
for(int i=0;i<n;i++)
{
int x1,y1,x2,y2;
scanf("%d %d %d %d",&x1,&y1,&x2,&y2);
prawy2[i]=max(x1,x2);
}
for(int i=0;i<n;i++)kol1[i]=i;
for(int i=0;i<n;i++)kol2[i]=i;
sort(kol1,kol1+n,cmp1);
sort(kol2,kol2+n,cmp2);
for(int i=0;i<n;i++)odwrkol1[kol1[i]]=i;
LD=1;
while(LD<n)LD*=2;
for(int i=0;i<LD*2;i++)drz[i]=0;
bool ok=true;
for(int q=0;q<n;q++)
{
int i=kol2[q];
int v=odwrkol1[i];
// maks na przedziale <v,n>
int m=maks(v,n-1);
if(m>W-wys[i])
{
ok=false;
break;
}
wstaw(v,wys[i]);
}
if(ok)puts("TAK");
else puts("NIE");
}
}
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 | #include <cstdio> #include <algorithm> #define MAKS 50010 using namespace std; int prawy1[MAKS]; int prawy2[MAKS]; int wys[MAKS]; inline int bw(int x){return (x>0?x:-x);} int kol1[MAKS]; int odwrkol1[MAKS]; int kol2[MAKS]; int drz[MAKS*4]; int LD; bool cmp1(int a, int b) { if(prawy1[a]!=prawy1[b])return prawy1[a]<prawy1[b]; return a<b; } bool cmp2(int a, int b) { if(prawy2[a]!=prawy2[b])return prawy2[a]<prawy2[b]; return a<b; } void wstaw(int v, int x) { v+=LD; drz[v]=x; v/=2; while(v>0) { drz[v]=max(drz[2*v],drz[2*v+1]); v/=2; } } int maks(int l, int p) { int ret=0; l+=LD; p+=LD; while(l<p) { if(l%2==0)l/=2; else { ret=max(ret,drz[l]); l++; l/=2; } if(p%2==1)p/=2; else { ret=max(ret,drz[p]); p--; p/=2; } } if(l==p)ret=max(ret,drz[l]); return ret; } int main() { int t,n,W; scanf("%d",&t); while(t--) { scanf("%d %d",&n,&W); for(int i=0;i<n;i++) { int x1,y1,x2,y2; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); wys[i]=bw(y1-y2); prawy1[i]=max(x1,x2); } for(int i=0;i<n;i++) { int x1,y1,x2,y2; scanf("%d %d %d %d",&x1,&y1,&x2,&y2); prawy2[i]=max(x1,x2); } for(int i=0;i<n;i++)kol1[i]=i; for(int i=0;i<n;i++)kol2[i]=i; sort(kol1,kol1+n,cmp1); sort(kol2,kol2+n,cmp2); for(int i=0;i<n;i++)odwrkol1[kol1[i]]=i; LD=1; while(LD<n)LD*=2; for(int i=0;i<LD*2;i++)drz[i]=0; bool ok=true; for(int q=0;q<n;q++) { int i=kol2[q]; int v=odwrkol1[i]; // maks na przedziale <v,n> int m=maks(v,n-1); if(m>W-wys[i]) { ok=false; break; } wstaw(v,wys[i]); } if(ok)puts("TAK"); else puts("NIE"); } } |
English