Submission
Status:
(-SSSSSSSS)(SSSS)(-SSSSS)(SSSSSSSSSS)
Subtask/Task Score:
{0/25}{0/25}{0/20}{0/30}
Score: 0
User: SparkPun
Problemset: เดินทางข้ามชุมชน
Language: cpp
Time: 0.002 second
Submitted On: 2026-03-22 16:50:14
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<tuple<int,int,int>>edge;
int parent[N],sz[N];
bool cmp(const tuple<int,int,int>&a,const tuple<int,int,int>&b){
return get<2>(a)<get<2>(b);
}
int findSet(int u){
if(parent[u]==u) return u;
return parent[u]=findSet(parent[u]);
}
void unionSet(int u,int v){
int U=findSet(u),V=findSet(v);
if(U!=V){
if(sz[U]<=sz[V]){
parent[V]=U;
sz[U]+=sz[V];
}
else{
parent[U]=V;
sz[V]+=sz[U];
}
}
}
int main(){
ios_base::sync_with_stdio(0),cin.tie(0);
int n,m,q;
cin >> n >> m >> q;
while(m--){
int u,v,w;
cin >> u >> v >> w;
edge.push_back({u,v,w});
}
sort(edge.begin(),edge.end(),cmp);
for(int i=0;i<=n;i++){
parent[i]=i;
sz[i]=1;
}
vector<tuple<int,int,int,int>>query;
for(int i=0;i<q;i++){
int a,b,k;
cin >> a >> b >> k;
query.push_back({k,a,b,i});
}
sort(query.begin(),query.end());
int i=0;
vector<bool>ans(q);
for(auto [k,a,b,idx]:query){
while(i<edge.size() && get<2>(edge[i])<=k){
auto [u,v,w]=edge[i];
unionSet(u,v);
i++;
}
if(findSet(a)==findSet(b)) ans[idx]=1;
else ans[idx]=0;
}
for(auto x:ans){
if(x) cout << "YES" << endl;
else cout << "NO" << endl;
}
}