#include<bits/stdc++.h>
using namespace std;
typedef uint64_t u64;
constexpr int N=1000;
int n,q,fa[N],faw[N],dep[N];
vector<pair<int,int>> G[N];
u64 a[N][N],b[N][N],c[N][N];
vector<pair<u64,u64>> vec1;
vector<tuple<u64,u64,u64>> vec2;
void init(int u,int f){
dep[u]=dep[f]+1;
for(auto[v,w]:G[u]){
if(v!=f){
fa[v]=u;
faw[v]=w;
init(v,u);
}
}
}
int main(){
scanf("%d%d",&n,&q);
for(int i=1;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
G[u].emplace_back(v,w);
G[v].emplace_back(u,w);
}
init(1,0);
vector<tuple<int,int,u64,u64,u64>> vec;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
int u=i,v=j;
c[i][j]^=(u64)1<<u;
c[i][j]^=(u64)1<<v;
while(u!=v){
if(dep[u]<dep[v])swap(u,v);
b[i][j]+=faw[u];
a[i][j]|=(u64)1<<u;
c[i][j]^=(u64)1<<u;
u=fa[u];
}
c[i][j]^=(u64)1<<u;
vec.emplace_back(i,j,a[i][j],c[i][j],b[i][j]);
}
}
u64 maxn=0;
for(auto[u1,v1,s1,t1,w1]:vec){
maxn=max(maxn,w1);
for(auto[u2,v2,s2,t2,w2]:vec){
if(s1&s2)continue;
if(t1&t2)continue;
vec1.emplace_back(w1,w2);
for(auto[u3,v3,s3,t3,w3]:vec){
if(s1&s3)continue;
if(s2&s3)continue;
if(t1&t3)continue;
if(t2&t3)continue;
vec2.emplace_back(w1,w2,w3);
}
}
}
init(1,0);
while(q--){
u64 a[3];
scanf("%lu%lu%lu",&a[0],&a[1],&a[2]);
bool f=0;
do{
f|=a[0]+a[1]+a[2]<=maxn;
if(f)break;
for(auto[w1,w2]:vec1){
f|=a[0]<=w1&&a[1]+a[2]<=w2;
f|=a[0]<=w2&&a[1]+a[2]<=w1;
}
if(f)break;
for(auto[w1,w2,w3]:vec2){
f|=a[0]<=w1&&a[1]<=w2&&a[2]<=w3;
}
if(f)break;
}
while(next_permutation(a,a+3));
puts(f?"TAK":"NIE");
}
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 | #include<bits/stdc++.h> using namespace std; typedef uint64_t u64; constexpr int N=1000; int n,q,fa[N],faw[N],dep[N]; vector<pair<int,int>> G[N]; u64 a[N][N],b[N][N],c[N][N]; vector<pair<u64,u64>> vec1; vector<tuple<u64,u64,u64>> vec2; void init(int u,int f){ dep[u]=dep[f]+1; for(auto[v,w]:G[u]){ if(v!=f){ fa[v]=u; faw[v]=w; init(v,u); } } } int main(){ scanf("%d%d",&n,&q); for(int i=1;i<n;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); G[u].emplace_back(v,w); G[v].emplace_back(u,w); } init(1,0); vector<tuple<int,int,u64,u64,u64>> vec; for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ int u=i,v=j; c[i][j]^=(u64)1<<u; c[i][j]^=(u64)1<<v; while(u!=v){ if(dep[u]<dep[v])swap(u,v); b[i][j]+=faw[u]; a[i][j]|=(u64)1<<u; c[i][j]^=(u64)1<<u; u=fa[u]; } c[i][j]^=(u64)1<<u; vec.emplace_back(i,j,a[i][j],c[i][j],b[i][j]); } } u64 maxn=0; for(auto[u1,v1,s1,t1,w1]:vec){ maxn=max(maxn,w1); for(auto[u2,v2,s2,t2,w2]:vec){ if(s1&s2)continue; if(t1&t2)continue; vec1.emplace_back(w1,w2); for(auto[u3,v3,s3,t3,w3]:vec){ if(s1&s3)continue; if(s2&s3)continue; if(t1&t3)continue; if(t2&t3)continue; vec2.emplace_back(w1,w2,w3); } } } init(1,0); while(q--){ u64 a[3]; scanf("%lu%lu%lu",&a[0],&a[1],&a[2]); bool f=0; do{ f|=a[0]+a[1]+a[2]<=maxn; if(f)break; for(auto[w1,w2]:vec1){ f|=a[0]<=w1&&a[1]+a[2]<=w2; f|=a[0]<=w2&&a[1]+a[2]<=w1; } if(f)break; for(auto[w1,w2,w3]:vec2){ f|=a[0]<=w1&&a[1]<=w2&&a[2]<=w3; } if(f)break; } while(next_permutation(a,a+3)); puts(f?"TAK":"NIE"); } return 0; } |
English