#include<cstdio>
#include<algorithm>
#define MAXN 50003
#define MAXT 131075
const int M = 65536;
using namespace std;
struct wie{
int lewy_x;
int wys;
int ind;
};
wie act;
wie tab1[MAXN];
wie tab2[MAXN];
int t,n,w;
int queryres;
bool zle;
int tree[MAXT];
int va,vb,v;
int x_1,x_2,y_1,y_2;
int gdzie_jest[MAXN];
int query(const int &pocz,const int &kon){
va = pocz + M;
vb = kon + M;
if(pocz > kon)return 0;
queryres = max(tree[va],tree[vb]);
while((va/2) != (vb/2)){
if(va % 2 == 0)queryres = max(queryres,tree[va+1]);
if(vb % 2 == 1)queryres = max(queryres,tree[vb-1]);
va/=2;
vb/=2;
}
return queryres;
}
void insert(const int &gdzie, int ile){
v = gdzie + M;
tree[v] = ile;
while(v != 1){
v/=2;
tree[v] = max(tree[v*2],tree[v*2+1]);
}
}
bool cmp1(const wie &a,const wie &b){
if(a.lewy_x < b.lewy_x)return 1;
return 0;
}
int main(){
scanf("%d",&t);
for(int q=0;q<t;q++){
scanf("%d",&n);
scanf("%d",&w);
for(int i=0;i<n;i++){
scanf("%d %d %d %d",&x_1,&y_1,&x_2,&y_2);
tab1[i].lewy_x = min(x_1,x_2);
tab1[i].wys = abs((y_1-y_2));
tab1[i].ind = i;
}
sort(tab1,tab1+n,cmp1);
for(int i=0;i<n;i++){
insert(i,tab1[i].wys);
gdzie_jest[tab1[i].ind] = i;
// printf("tab1> na miejscu %d: ind:%d, wys:%d, lewy_x: %d\n",i,tab1[i].ind,tab1[i].wys,tab1[i].lewy_x);
}
for(int i=0;i<n;i++){
scanf("%d %d %d %d",&x_1,&y_1,&x_2,&y_2);
tab2[i].lewy_x = min(x_1,x_2);
tab2[i].wys = abs((y_1-y_2));
tab2[i].ind = i;
}
sort(tab2,tab2+n,cmp1);
// for(int i=0;i<n;i++)printf("tab2> na miejscu %d: ind:%d, wys:%d, lewy_x: %d\n",i,tab2[i].ind,tab2[i].wys,tab2[i].lewy_x);
zle = 0;
for(int i=0;i<n;i++){
//wez pierwszy wierzcholek z tablicy tab2
act = tab2[i];
// printf("i:%d, act_wierzcholek: %d, w tab1 na miejscu: %d\n",i,act.ind,gdzie_jest[act.ind]);
// printf("query: %d, act_wys: %d, w: %d\n",query(0,(gdzie_jest[act.ind]-1)),act.wys,w);
if(( query(0,(gdzie_jest[act.ind]-1)) + act.wys) > w){
zle = 1;
break;
}
insert(gdzie_jest[act.ind],0);
}
if(zle == 0)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 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 | #include<cstdio> #include<algorithm> #define MAXN 50003 #define MAXT 131075 const int M = 65536; using namespace std; struct wie{ int lewy_x; int wys; int ind; }; wie act; wie tab1[MAXN]; wie tab2[MAXN]; int t,n,w; int queryres; bool zle; int tree[MAXT]; int va,vb,v; int x_1,x_2,y_1,y_2; int gdzie_jest[MAXN]; int query(const int &pocz,const int &kon){ va = pocz + M; vb = kon + M; if(pocz > kon)return 0; queryres = max(tree[va],tree[vb]); while((va/2) != (vb/2)){ if(va % 2 == 0)queryres = max(queryres,tree[va+1]); if(vb % 2 == 1)queryres = max(queryres,tree[vb-1]); va/=2; vb/=2; } return queryres; } void insert(const int &gdzie, int ile){ v = gdzie + M; tree[v] = ile; while(v != 1){ v/=2; tree[v] = max(tree[v*2],tree[v*2+1]); } } bool cmp1(const wie &a,const wie &b){ if(a.lewy_x < b.lewy_x)return 1; return 0; } int main(){ scanf("%d",&t); for(int q=0;q<t;q++){ scanf("%d",&n); scanf("%d",&w); for(int i=0;i<n;i++){ scanf("%d %d %d %d",&x_1,&y_1,&x_2,&y_2); tab1[i].lewy_x = min(x_1,x_2); tab1[i].wys = abs((y_1-y_2)); tab1[i].ind = i; } sort(tab1,tab1+n,cmp1); for(int i=0;i<n;i++){ insert(i,tab1[i].wys); gdzie_jest[tab1[i].ind] = i; // printf("tab1> na miejscu %d: ind:%d, wys:%d, lewy_x: %d\n",i,tab1[i].ind,tab1[i].wys,tab1[i].lewy_x); } for(int i=0;i<n;i++){ scanf("%d %d %d %d",&x_1,&y_1,&x_2,&y_2); tab2[i].lewy_x = min(x_1,x_2); tab2[i].wys = abs((y_1-y_2)); tab2[i].ind = i; } sort(tab2,tab2+n,cmp1); // for(int i=0;i<n;i++)printf("tab2> na miejscu %d: ind:%d, wys:%d, lewy_x: %d\n",i,tab2[i].ind,tab2[i].wys,tab2[i].lewy_x); zle = 0; for(int i=0;i<n;i++){ //wez pierwszy wierzcholek z tablicy tab2 act = tab2[i]; // printf("i:%d, act_wierzcholek: %d, w tab1 na miejscu: %d\n",i,act.ind,gdzie_jest[act.ind]); // printf("query: %d, act_wys: %d, w: %d\n",query(0,(gdzie_jest[act.ind]-1)),act.wys,w); if(( query(0,(gdzie_jest[act.ind]-1)) + act.wys) > w){ zle = 1; break; } insert(gdzie_jest[act.ind],0); } if(zle == 0)printf("TAK\n"); else printf("NIE\n"); } return 0; } |
English