Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
116
117
118
119
#include <algorithm>
#include <vector>
#include <cstdio>
#define MAX 500009
using namespace std;

struct car{
    int x, y, w, h, oldx;
    int numer, index;
    car() {};
    car(int x, int y, int w, int h, int index){
        this->x = x;
        this->h = h;
        this->index = index;
    }
};

int tab[MAX];
vector<car> przed, po;
int wysokosc;
#define DB if(0)
vector<car> merge_sort(vector<car> a, int h){
    //for(int i=0; i<a.size(); i++)printf("%d ", a[i].index);
    //printf("\n");
    if(a.size() == 1)return a;
    vector <car> p1, p2;
    int siz = a.size();
    for(int i=0; i<siz; i++){
        if(i<siz/2)p1.push_back(a[i]);
        else p2.push_back(a[i]);
    }

    p1 = merge_sort(p1, h);
    p2 = merge_sort(p2, h);

    int c = 0, b = 0;
    a.clear();
    while(c < p1.size() && b < p2.size()){
        DB printf("przerabiam %d %d\n", p1[c].index, p2[b].index);
        if(p1[c].h + p2[b].h > h){ /// bo by�y wst�pnie posortowanie po x-ach, wi�c ten z p1 b�dzie mniejszy
            DB printf("wrzucam %d bo sie nie mieszcza\n", p1[c].index);
            a.push_back(p1[c++]);
            continue;
        }
        if(p1[c].h == p2[b].h){
            if(p1[c].index < p2[b].index)
                a.push_back(p1[c++]);
            else
                a.push_back(p2[b++]);
            //DB printf("wrzucam %d bo rowne wysokosci\n", p1[c].index);
            continue;
        }
        if(p1[c].h < p2[b].h){ /// je�li p1[c] jest ni�sze to jest pierwsze, je�li p2[b] to drugie
            DB printf("wrzucam %d bo jest nizsze\n", p1[c].index);
            a.push_back(p1[c++]);
        }
        else{
            DB printf("wrzucam %d bo jest nizsze\n", p2[b].index);
            a.push_back(p2[b++]);
        }
    }
    /// dobijam ko�c�wki
    while(c < p1.size())
        a.push_back(p1[c++]);
    while(b < p2.size())
        a.push_back(p2[b++]);

    //for(car _car : a)printf("i: %d ", _car.index);
    //printf("\n");
    return a;
}
void clears(int n){
    przed.clear();
    po.clear();
}
bool fun2(car a, car b){
    if(a.x == b.x)return a.index < b.index;
    return a.x < b.x;
}
void wypisz(car a){
    //printf("i: %d\n", a.index);
}
int main(){
    int t;
    scanf("%d", &t);
    while(t--){
        int n, w;
        scanf("%d%d", &n, &w);
        wysokosc = w;
        int a, b, c, d;
        for(int i=1; i<=n; i++){
            scanf("%d%d%d%d", &a, &b, &c, &d);
            przed.push_back(car(a, b, abs(c-a), abs(b-d), i));
            przed.back().oldx = a;
        }
        for(int i=1; i<=n; i++){
            scanf("%d%d%d%d", &a, &b, &c, &d);
            po.push_back(car(a, b, abs(c-a), abs(b-d), i));
        }
        for(int i=1; i<=n; i++){
             po[i-1].oldx = przed[i-1].x;
        }
        sort(przed.begin(), przed.end(), fun2);
        sort(po.begin(), po.end(), fun2);

        przed = merge_sort(przed, w);
        po = merge_sort(po, w);

        bool ok = true;

        for(int i=0; i<przed.size(); i++){
            if(przed[i].index != po[i].index)ok = false;
        }

        if(ok)printf("TAK\n");
        else printf("NIE\n");
        clears(n);
    }
}