#include<cstdio>
#include<algorithm>
using namespace std;
struct dane{
long long h,x;
int i;
}T[100009],D[100009];
int t,n,IND[100009];
long long W;
//Drzewo****************************************
long long baza[131072];
void ustal_0(int N){
for(int i=0;i<N;i++)baza[i+65536]=T[i].h;
}
void ustal(){
for(int i=65535;i>0;i--)baza[i]=max(baza[i*2],baza[i*2+1]);
}
long long maks(int X){
X+=65536;
long long pom=baza[X];
while(X>1){
if(X%2==1)pom=max(pom,baza[X-1]);
X/=2;
}
return pom;
}
void usuni(int X){
X+=65536;
baza[X]=-1;
X/=2;
while(X>0){
baza[X]=max(baza[X*2],baza[X*2+1]);
X/=2;
}
}
void czysc(){
for(int i=0;i<131072;i++)baza[i]=0;
}
//***********************************************
bool por(dane A,dane B){
if(A.x<B.x) return 1;
return 0;
}
int main(){
long long x_1,y_1,x_2,y_2,przen;
int pomi;
scanf("%d",&t);
while(t--){
scanf("%d%lld",&n,&W);
for(int i=0;i<n;i++){
scanf("%lld%lld%lld%lld",&x_1,&y_1,&x_2,&y_2);
if(x_1<x_2)T[i].x=x_1; else T[i].x=x_2;
T[i].h=y_2-y_1;
T[i].i=i;
if(T[i].h<0)T[i].h*=-1;
}
sort(T,T+n,por);
for(int i=0;i<n;i++){
scanf("%lld%lld%lld%lld",&x_1,&y_1,&x_2,&y_2);
if(x_1<x_2)D[i].x=x_1; else D[i].x=x_2;
D[i].h=y_2-y_1;
D[i].i=i;
if(D[i].h<0)D[i].h*=-1;
}
sort(D,D+n,por);
for(int i=0;i<n;i++)IND[T[i].i]=i;
czysc();
ustal_0(n);
ustal();
int ok=1;
for(int i=0;i<n&&ok;i++){
pomi=D[i].i;
usuni(IND[pomi]);
przen=maks(IND[pomi]);
if(przen+T[IND[pomi]].h>W)ok=0;
}
if(ok)printf("TAK\n"); else printf("NIE\n");
}
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 | #include<cstdio> #include<algorithm> using namespace std; struct dane{ long long h,x; int i; }T[100009],D[100009]; int t,n,IND[100009]; long long W; //Drzewo**************************************** long long baza[131072]; void ustal_0(int N){ for(int i=0;i<N;i++)baza[i+65536]=T[i].h; } void ustal(){ for(int i=65535;i>0;i--)baza[i]=max(baza[i*2],baza[i*2+1]); } long long maks(int X){ X+=65536; long long pom=baza[X]; while(X>1){ if(X%2==1)pom=max(pom,baza[X-1]); X/=2; } return pom; } void usuni(int X){ X+=65536; baza[X]=-1; X/=2; while(X>0){ baza[X]=max(baza[X*2],baza[X*2+1]); X/=2; } } void czysc(){ for(int i=0;i<131072;i++)baza[i]=0; } //*********************************************** bool por(dane A,dane B){ if(A.x<B.x) return 1; return 0; } int main(){ long long x_1,y_1,x_2,y_2,przen; int pomi; scanf("%d",&t); while(t--){ scanf("%d%lld",&n,&W); for(int i=0;i<n;i++){ scanf("%lld%lld%lld%lld",&x_1,&y_1,&x_2,&y_2); if(x_1<x_2)T[i].x=x_1; else T[i].x=x_2; T[i].h=y_2-y_1; T[i].i=i; if(T[i].h<0)T[i].h*=-1; } sort(T,T+n,por); for(int i=0;i<n;i++){ scanf("%lld%lld%lld%lld",&x_1,&y_1,&x_2,&y_2); if(x_1<x_2)D[i].x=x_1; else D[i].x=x_2; D[i].h=y_2-y_1; D[i].i=i; if(D[i].h<0)D[i].h*=-1; } sort(D,D+n,por); for(int i=0;i<n;i++)IND[T[i].i]=i; czysc(); ustal_0(n); ustal(); int ok=1; for(int i=0;i<n&&ok;i++){ pomi=D[i].i; usuni(IND[pomi]); przen=maks(IND[pomi]); if(przen+T[IND[pomi]].h>W)ok=0; } if(ok)printf("TAK\n"); else printf("NIE\n"); } return 0; } |
English