#include<cstdio>
#include<algorithm>
#include<vector>
#define maxN 50100
#define SIZE ((1<<17)+5)
#define length (1<<16)
using namespace std;
struct car {
int h, place, nr; /// wyskosc, prawy koniec, lewy koniec
car(const int &x,const int &y,const int &xx,const int &yy, const int &i) {
h = y-yy;
if(h<0) h = -1*h;
nr = i;
place = min(x, xx);
}
};
vector<car> in, out;
vector<int> posit;
struct tree {
int maxx[SIZE], czapa, ans;
void new_() {
czapa = length;
for(int i=0; i<SIZE; ++i)
maxx[i]=0;
}
void insert_(int msc, int liczba) {
msc += czapa;
maxx[msc] = liczba;
msc/=2;
while(msc>0){
maxx[msc] = max(maxx[2*msc], maxx[2*msc +1]);
msc/=2;
}
}
void solve(int w, int p, int q, int a, int b) {
if(p == a and q == b) {
ans = max(ans, maxx[w]);
return ;
}
int m = (p+q)/2;
if(b <= m) solve(2*w, p, m, a, b);
else if(a >= m ) solve(2*w+1, m, q, a, b);
else {
solve(2*w, p, m, a, m);
solve(2*w+1, m, q, m, b);
}
}
int query_(int a, int b) {
ans = 0;
if(a == b) return 0;
solve(1, 0, czapa, a, b);
return ans;
}
};
tree itree;
bool cmp(car a, car b) {
if(a.place < b.place) return 1;
return 0;
}
void solve_test() {
int n, x, y, xx, yy, W;
scanf("%d%d", &n, &W);
posit.resize(n);
for(int i=0; i<n; ++i){
scanf("%d%d%d%d", &x, &y, &xx, &yy);
car wagen = car(x, y, xx, yy, i);
in.push_back(wagen);
}
for(int i=0; i<n; ++i){
scanf("%d%d%d%d", &x, &y, &xx, &yy);
car wagen = car(x, y, xx, yy, i);
out.push_back(wagen);
}
sort(in.begin(), in.end(), cmp);
sort(out.begin(), out.end(), cmp);
for(int i=0; i<n; ++i)
posit[out[i].nr] = i;
for(int i=0; i<n; ++i) {
int maxx = itree.query_(posit[in[i].nr] +1, n);
if(maxx + in[i].h > W) {
printf("NIE\n");
return ;
}
itree.insert_(posit[in[i].nr] , in[i].h);
}
printf("TAK\n");
return ;
}
int main() {
int testy;
scanf("%d", &testy);
while(testy--) {
itree.new_();
int rozm = in.size();
for(int i=0; i<rozm; ++i) {
out.pop_back();
in.pop_back();
}
solve_test();
}
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 | #include<cstdio> #include<algorithm> #include<vector> #define maxN 50100 #define SIZE ((1<<17)+5) #define length (1<<16) using namespace std; struct car { int h, place, nr; /// wyskosc, prawy koniec, lewy koniec car(const int &x,const int &y,const int &xx,const int &yy, const int &i) { h = y-yy; if(h<0) h = -1*h; nr = i; place = min(x, xx); } }; vector<car> in, out; vector<int> posit; struct tree { int maxx[SIZE], czapa, ans; void new_() { czapa = length; for(int i=0; i<SIZE; ++i) maxx[i]=0; } void insert_(int msc, int liczba) { msc += czapa; maxx[msc] = liczba; msc/=2; while(msc>0){ maxx[msc] = max(maxx[2*msc], maxx[2*msc +1]); msc/=2; } } void solve(int w, int p, int q, int a, int b) { if(p == a and q == b) { ans = max(ans, maxx[w]); return ; } int m = (p+q)/2; if(b <= m) solve(2*w, p, m, a, b); else if(a >= m ) solve(2*w+1, m, q, a, b); else { solve(2*w, p, m, a, m); solve(2*w+1, m, q, m, b); } } int query_(int a, int b) { ans = 0; if(a == b) return 0; solve(1, 0, czapa, a, b); return ans; } }; tree itree; bool cmp(car a, car b) { if(a.place < b.place) return 1; return 0; } void solve_test() { int n, x, y, xx, yy, W; scanf("%d%d", &n, &W); posit.resize(n); for(int i=0; i<n; ++i){ scanf("%d%d%d%d", &x, &y, &xx, &yy); car wagen = car(x, y, xx, yy, i); in.push_back(wagen); } for(int i=0; i<n; ++i){ scanf("%d%d%d%d", &x, &y, &xx, &yy); car wagen = car(x, y, xx, yy, i); out.push_back(wagen); } sort(in.begin(), in.end(), cmp); sort(out.begin(), out.end(), cmp); for(int i=0; i<n; ++i) posit[out[i].nr] = i; for(int i=0; i<n; ++i) { int maxx = itree.query_(posit[in[i].nr] +1, n); if(maxx + in[i].h > W) { printf("NIE\n"); return ; } itree.insert_(posit[in[i].nr] , in[i].h); } printf("TAK\n"); return ; } int main() { int testy; scanf("%d", &testy); while(testy--) { itree.new_(); int rozm = in.size(); for(int i=0; i<rozm; ++i) { out.pop_back(); in.pop_back(); } solve_test(); } return 0; } |
English