Submission

Status:

(PPPPPPPPP)(PPPP)(PPPPPP)(PPPPPPPPPP)

Subtask/Task Score:

{25/25}{25/25}{20/20}{30/30}

Score: 100

User: SparkPun

Problemset: เดินทางข้ามชุมชน

Language: cpp

Time: 0.530 second

Submitted On: 2026-03-22 16:52:24

#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;
    }
}