#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int t;
int n, w, m;
int wys1, wys2;
int kol1[50007];
int kol2[50007];
int dlu1, dlu2;
int odl[50007];
int gru[50007];
int drzewo[140000];
int wyn;
bool jes;
int vi;
bool mniej(int a, int b)
{
if (odl[a]==odl[b])
return a<b;
return odl[a]<odl[b];
}
int pot(int v)
{
for (int i=1; i; i*=2)
if (i>=v)
return i;
}
int szum(int v, int a, int b, int graa, int grab)
{
if (b<graa || a>grab)
return 0;
if (a>=graa && b<=grab)
return drzewo[v];
return max(szum(v*2, a, (a+b)/2, graa, grab), szum(v*2+1, (a+b)/2+1, b, graa, grab));
}
int main()
{
scanf("%d", &t);
for (int h=1; h<=t; h++)
{
jes=true;
for (int i=0; i<=m*2; i++)
drzewo[i]=0;
scanf("%d%d", &n, &w);
m=pot(n);
for (int i=1; i<=n; i++)
{
scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2);
gru[i]=wys2-wys1;
odl[i]=dlu1;
kol1[i]=i;
}
sort(kol1+1, kol1+1+n, mniej);
for (int i=1; i<=n; i++)
{
scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2);
odl[i]=dlu1;
kol2[i]=i;
}
sort(kol2+1, kol2+1+n, mniej);
for (int i=1; i<=n; i++)
{
odl[kol1[i]]=i;
}
for (int i=1; i<=n; i++)
{
drzewo[i+m-1]=gru[kol1[i]];
}
for (int i=1; i<=n; i++)
for (int i=m-1; i>0; i--)
drzewo[i]=max(drzewo[i*2], drzewo[i*2+1]);
for (int i=1; i<=n; i++)
{
wyn=szum(1, 1, m, 1, odl[kol2[i]]-1);
if (odl[kol2[i]]==1 || w-wyn>=gru[kol2[i]])
{
vi=m-1+odl[kol2[i]];
drzewo[vi]=0;
while(vi>1)
{
vi/=2;
drzewo[vi]=max(drzewo[vi*2], drzewo[vi*2+1]);
}
}
else
{
jes=false;
break;
}
}
if (jes)
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 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; int t; int n, w, m; int wys1, wys2; int kol1[50007]; int kol2[50007]; int dlu1, dlu2; int odl[50007]; int gru[50007]; int drzewo[140000]; int wyn; bool jes; int vi; bool mniej(int a, int b) { if (odl[a]==odl[b]) return a<b; return odl[a]<odl[b]; } int pot(int v) { for (int i=1; i; i*=2) if (i>=v) return i; } int szum(int v, int a, int b, int graa, int grab) { if (b<graa || a>grab) return 0; if (a>=graa && b<=grab) return drzewo[v]; return max(szum(v*2, a, (a+b)/2, graa, grab), szum(v*2+1, (a+b)/2+1, b, graa, grab)); } int main() { scanf("%d", &t); for (int h=1; h<=t; h++) { jes=true; for (int i=0; i<=m*2; i++) drzewo[i]=0; scanf("%d%d", &n, &w); m=pot(n); for (int i=1; i<=n; i++) { scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2); gru[i]=wys2-wys1; odl[i]=dlu1; kol1[i]=i; } sort(kol1+1, kol1+1+n, mniej); for (int i=1; i<=n; i++) { scanf("%d%d%d%d", &dlu1, &wys1, &dlu2, &wys2); odl[i]=dlu1; kol2[i]=i; } sort(kol2+1, kol2+1+n, mniej); for (int i=1; i<=n; i++) { odl[kol1[i]]=i; } for (int i=1; i<=n; i++) { drzewo[i+m-1]=gru[kol1[i]]; } for (int i=1; i<=n; i++) for (int i=m-1; i>0; i--) drzewo[i]=max(drzewo[i*2], drzewo[i*2+1]); for (int i=1; i<=n; i++) { wyn=szum(1, 1, m, 1, odl[kol2[i]]-1); if (odl[kol2[i]]==1 || w-wyn>=gru[kol2[i]]) { vi=m-1+odl[kol2[i]]; drzewo[vi]=0; while(vi>1) { vi/=2; drzewo[vi]=max(drzewo[vi*2], drzewo[vi*2+1]); } } else { jes=false; break; } } if (jes) printf("TAK\n"); else printf("NIE\n"); } return 0; } |
English