Submission

Status:

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

Subtask/Task Score:

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

Score: 100

User: tull

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

Language: cpp

Time: 0.156 second

Submitted On: 2026-04-25 22:15:39

#pragma GCC optimize("O3,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define all(A) A.begin(),A.end()
struct DSU{
    vector<int>rnk,par;
    DSU(int n):rnk(n+10),par(n+10){
        iota(all(par),0);
    }
    int Find(int a){
        return par[a]==a?a:par[a]=Find(par[a]);
    }
    bool Same(int a,int b){
        return Find(a)==Find(b);
    }
    void Union(int a,int b){
        a=Find(a);
        b=Find(b);
        if(rnk[a]>rnk[b]){
            par[b]=a;
        }else if(rnk[a]<rnk[b]){
            par[a]=b;
        }else{
            par[b]=a;
            ++rnk[a];
        }
    }
};
signed main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    int n,q,m,l,r,x;
    cin>>n>>m>>q;
    DSU dsu(n+10);
    vector<array<int,3>>edge(m);
    for(int i=0;i<m;++i){
        cin>>l>>r>>x;
        edge[i]={x,l,r};
    }
    sort(all(edge));
    vector<array<int,4>>query(q);
    vector<int>ans(q);
    for(int i=0;i<q;++i){
        cin>>l>>r>>x;
        query[i]={x,l,r,i};
    }
    int j=0;
    sort(all(query));
    string p[]={"No","Yes"};
    for(int i=0;i<q;++i){
        auto [x,l,r,ind]=query[i];
        while(j<m and x>=edge[j][0]){
            auto [w,tl,tr]=edge[j++];
            dsu.Union(tl,tr);
        }
        ans[ind]=dsu.Same(l,r);
    }
    for(int i=0;i<q;++i){
        cout<<p[ans[i]]<<'\n';
    }
}