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