#include <cstdio>
#include <algorithm>
using namespace std;
const int C = 1<<16;
int x[C];
bool cmp(int a, int b) { return x[a]<x[b]; }
int tree[2*C];
void set(int a, int x) {
a += C;
tree[a] = x;
while (a/=2) tree[a] = min(tree[2*a], tree[2*a+1]);
}
int get_min(int a, int b) {
a += C; b += C;
int res = min(tree[a],tree[b]);
while (a/2 != b/2) {
if (a%2==0) res = min(res, tree[a+1]);
if (b%2) res = min(res, tree[b-1]);
a/=2; b/=2;
}
return res;
}
int main() {
int T;
scanf("%d", &T);
while (T--) {
for (int i=0; i<2*C; i++) tree[i] = 2e9;
int n,w;
scanf("%d%d", &n,&w);
int y1,y2,a,h[n],t[n],start_pos[n];
for (int i=0; i<n; i++) {
scanf("%d%d%d%d", &x[i],&y1,&a,&y2);
if (a < x[i]) x[i] = a;
h[i] = abs(y1-y2);
t[i] = i;
}
sort(t,t+n,cmp);
for (int i=0; i<n; i++) {
set(i,w-h[t[i]]);
start_pos[t[i]] = i;
scanf("%d%d%d%d", &x[i],&y1,&a,&y2);
}
sort(t,t+n,cmp);
bool ans = true;
for (int i=0; i<n; i++) {
if (start_pos[t[i]] && get_min(0,start_pos[t[i]]-1) < h[t[i]]) {
ans = false;
break;
}
set(start_pos[t[i]], 2e9);
}
printf(ans?"TAK\n":"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 | #include <cstdio> #include <algorithm> using namespace std; const int C = 1<<16; int x[C]; bool cmp(int a, int b) { return x[a]<x[b]; } int tree[2*C]; void set(int a, int x) { a += C; tree[a] = x; while (a/=2) tree[a] = min(tree[2*a], tree[2*a+1]); } int get_min(int a, int b) { a += C; b += C; int res = min(tree[a],tree[b]); while (a/2 != b/2) { if (a%2==0) res = min(res, tree[a+1]); if (b%2) res = min(res, tree[b-1]); a/=2; b/=2; } return res; } int main() { int T; scanf("%d", &T); while (T--) { for (int i=0; i<2*C; i++) tree[i] = 2e9; int n,w; scanf("%d%d", &n,&w); int y1,y2,a,h[n],t[n],start_pos[n]; for (int i=0; i<n; i++) { scanf("%d%d%d%d", &x[i],&y1,&a,&y2); if (a < x[i]) x[i] = a; h[i] = abs(y1-y2); t[i] = i; } sort(t,t+n,cmp); for (int i=0; i<n; i++) { set(i,w-h[t[i]]); start_pos[t[i]] = i; scanf("%d%d%d%d", &x[i],&y1,&a,&y2); } sort(t,t+n,cmp); bool ans = true; for (int i=0; i<n; i++) { if (start_pos[t[i]] && get_min(0,start_pos[t[i]]-1) < h[t[i]]) { ans = false; break; } set(start_pos[t[i]], 2e9); } printf(ans?"TAK\n":"NIE\n"); } return 0; } |
English