Submission

Status:

(-SSSSSSSS)(SSSS)(-SSSSS)(SSSSSSSSSS)

Subtask/Task Score:

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

Score: 0

User: mydKN

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

Language: cpp

Time: 0.002 second

Submitted On: 2026-03-09 23:09:12

#include <bits/stdc++.h>

using namespace std;

#define pb push_back

struct Edge{
	int w, u, v;
	bool operator<(const Edge& o) const{
		return w < o.w;
	}
};

struct Query{
	int w, u, v, i;
	bool operator<(const Query& o) const{
		return w < o.w;
	}
};

const int maxn = 1e5 + 5;
const int maxq = 3e5 + 5;

int n, m, q;
vector<Edge> edge;
vector<Query> query;
int pa[maxn], sz[maxn];
bool res[maxq];

int findset(int u){
	if(pa[u] == u) return u;
	return pa[u] = findset(pa[u]);
}

void unite(int u, int v){
	u = findset(u);
	v = findset(v);
	if(u == v) return;
	if(sz[v] > sz[u]) swap(u, v);
	sz[u] += sz[v];
	pa[v] = u;
}

int main(){
	ios_base::sync_with_stdio(0);cin.tie(0);
	cin >> n >> m >> q;
	for(int i=0;i<m;++i){
		int u, v, w;
		cin >> u >> v >> w;
		edge.pb({w, u, v});
	}
	for(int i=0;i<q;++i){
		int u, v, w;
		cin >> u >> v >> w;
		query.pb({w, u, v, i});
	}
	sort(query.begin(), query.end());
	sort(edge.begin(), edge.end());
	iota(pa, pa+n, 0);
	fill(sz, sz+n, 1);
	int idx = 0;
	for(auto [w, u, v, i] : query){
		while(idx < m && edge[idx].w <= w){
			unite(edge[idx].u, edge[idx].v);
			++idx;
		}
		res[i] = (findset(u) == findset(v));
	}
	for(int i=0;i<q;++i){
		cout << (res[i] ? "YES" : "NO") << "\n";
	}
}