#include<iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; int t, n, wys, baza, a, b, c, d, tabl[50009], pr, lw, akt, z, maxi, drze[200009]; vector<pair<int, pair<int, int> > >pocz, kon; int main() { scanf("%d", &t); for(int p=0; p<t; p++) { scanf("%d %d", &n, &wys); pocz.clear(); kon.clear(); baza=1; while(baza<n){ baza*=2; } for(int pp=0; pp<=baza*2+10; pp++){drze[pp]=0;} for(int pp=1; pp<=n; pp++) { scanf("%d %d %d %d", &a, &b, &c, &d); pocz.push_back(make_pair(a, make_pair(d-b, pp))); } for(int pp=1; pp<=n; pp++) { scanf("%d %d %d %d", &a, &b, &c, &d); kon.push_back(make_pair(a, make_pair(d-b, pp))); } sort(pocz.begin(), pocz.end()); sort(kon.begin(), kon.end()); for(int pp=0; pp<pocz.size(); pp++) { akt=baza+pp; drze[akt]=pocz[pp].second.first; while(akt>0) { drze[akt]=max(drze[akt], pocz[pp].second.first); //printf("%d\n", drze[akt]); akt/=2; } tabl[pocz[pp].second.second]=pp; } z=0; for(int pp=0; pp<kon.size(); pp++) { lw=pp+baza; pr=baza+tabl[kon[pp].second.second]-1; maxi=0; while(lw<pr) { maxi=max(maxi, drze[lw]); maxi=max(maxi, drze[pr]); if(lw%2==0)lw/=2; else lw=(lw/2)+1; if(pr%2==1)pr/=2; else pr=(pr/2)-1; } if(lw==pr)maxi=max(maxi, drze[lw]); //printf("%d\n", maxi); if(maxi+kon[pp].second.first>wys) { z=1; break; } akt=baza+tabl[kon[pp].second.second]; drze[akt]=0; akt/=2; while(akt>0) { drze[akt]=max(drze[akt*2], drze[akt*2+1]); akt/=2; } } if(z==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 | #include<iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; int t, n, wys, baza, a, b, c, d, tabl[50009], pr, lw, akt, z, maxi, drze[200009]; vector<pair<int, pair<int, int> > >pocz, kon; int main() { scanf("%d", &t); for(int p=0; p<t; p++) { scanf("%d %d", &n, &wys); pocz.clear(); kon.clear(); baza=1; while(baza<n){ baza*=2; } for(int pp=0; pp<=baza*2+10; pp++){drze[pp]=0;} for(int pp=1; pp<=n; pp++) { scanf("%d %d %d %d", &a, &b, &c, &d); pocz.push_back(make_pair(a, make_pair(d-b, pp))); } for(int pp=1; pp<=n; pp++) { scanf("%d %d %d %d", &a, &b, &c, &d); kon.push_back(make_pair(a, make_pair(d-b, pp))); } sort(pocz.begin(), pocz.end()); sort(kon.begin(), kon.end()); for(int pp=0; pp<pocz.size(); pp++) { akt=baza+pp; drze[akt]=pocz[pp].second.first; while(akt>0) { drze[akt]=max(drze[akt], pocz[pp].second.first); //printf("%d\n", drze[akt]); akt/=2; } tabl[pocz[pp].second.second]=pp; } z=0; for(int pp=0; pp<kon.size(); pp++) { lw=pp+baza; pr=baza+tabl[kon[pp].second.second]-1; maxi=0; while(lw<pr) { maxi=max(maxi, drze[lw]); maxi=max(maxi, drze[pr]); if(lw%2==0)lw/=2; else lw=(lw/2)+1; if(pr%2==1)pr/=2; else pr=(pr/2)-1; } if(lw==pr)maxi=max(maxi, drze[lw]); //printf("%d\n", maxi); if(maxi+kon[pp].second.first>wys) { z=1; break; } akt=baza+tabl[kon[pp].second.second]; drze[akt]=0; akt/=2; while(akt>0) { drze[akt]=max(drze[akt*2], drze[akt*2+1]); akt/=2; } } if(z==0)printf("TAK\n"); else printf("NIE\n"); } return 0; } |