#include <cstdio>
#include <algorithm>
using namespace std;
int nr[50000];
int h[50000];
pair<int, int> p[50000];
const int S = 1 << 16;
int mx[S << 1];
void clear(int x)
{
x += S;
mx[x] = 0;
while(x > 1)
{
x >>= 1;
mx[x] = max(mx[x * 2], mx[x * 2 + 1]);
}
}
int max(int b)
{
b += S;
int a = S, ans = 0;
while(a < b)
{
if((b & 1) == 0) ans = max(ans, mx[b--]);
a >>= 1;
b >>= 1;
}
if(a == b) ans = max(ans, mx[a]);
return ans;
}
int main()
{
int test, n, w, x1, x2, y1, y2;
scanf("%d", &test);
while(test--)
{
scanf("%d %d", &n, &w);
for(int i = 0; i < n; i++)
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
p[i] = make_pair(min(x1, x2), i);
h[i] = abs(y1 - y2);
}
sort(p, p + n);
for(int i = 0; i < n; i++)
nr[p[i].second] = i;
for(int i = 0; i < n; i++)
mx[nr[i] + S] = h[i];
for(int i = n; i < S; i++)
mx[i + S] = 0;
for(int i = S - 1; i > 0; i--)
mx[i] = max(mx[i*2], mx[i*2+1]);
for(int i = 0; i < n; i++)
{
scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
p[i] = make_pair(min(x1, x2), i);
}
sort(p, p + n);
bool ok = true;
for(int i = 0; i < n; i++)
{
int k = p[i].second;
if(h[k] + max(nr[k] - 1) > w)
{
ok = false;
break;
}
clear(nr[k]);
}
puts(ok ? "TAK" : "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 | #include <cstdio> #include <algorithm> using namespace std; int nr[50000]; int h[50000]; pair<int, int> p[50000]; const int S = 1 << 16; int mx[S << 1]; void clear(int x) { x += S; mx[x] = 0; while(x > 1) { x >>= 1; mx[x] = max(mx[x * 2], mx[x * 2 + 1]); } } int max(int b) { b += S; int a = S, ans = 0; while(a < b) { if((b & 1) == 0) ans = max(ans, mx[b--]); a >>= 1; b >>= 1; } if(a == b) ans = max(ans, mx[a]); return ans; } int main() { int test, n, w, x1, x2, y1, y2; scanf("%d", &test); while(test--) { scanf("%d %d", &n, &w); for(int i = 0; i < n; i++) { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); p[i] = make_pair(min(x1, x2), i); h[i] = abs(y1 - y2); } sort(p, p + n); for(int i = 0; i < n; i++) nr[p[i].second] = i; for(int i = 0; i < n; i++) mx[nr[i] + S] = h[i]; for(int i = n; i < S; i++) mx[i + S] = 0; for(int i = S - 1; i > 0; i--) mx[i] = max(mx[i*2], mx[i*2+1]); for(int i = 0; i < n; i++) { scanf("%d %d %d %d", &x1, &y1, &x2, &y2); p[i] = make_pair(min(x1, x2), i); } sort(p, p + n); bool ok = true; for(int i = 0; i < n; i++) { int k = p[i].second; if(h[k] + max(nr[k] - 1) > w) { ok = false; break; } clear(nr[k]); } puts(ok ? "TAK" : "NIE"); } } |
English