グラフとクエリがあるが,いずれも年に関して降順ソートする. ソートすることで,クエリ毎にUnion-find を作り直す必要が無くなり, 同じUnion-find を使いまわせる.
年が同じときは,クエリに答える方を,Union-find の merge より先に行う.
int main() {
ll n, m, k, q;
cin >> n >> m;
UnionFind<ll> uf(2e5+10);
rep(i,m){
ll a,b,y; cin >> a >> b >> y;
--a,--b;
road[y].emplace_back(a,b);
}
cin >> q;
rep(qi,q){
ll v,w; cin >> v >> w;
v--;
query[w].emplace_back(qi,v);
}
vll ans(q);
drep(y, 2e5+10) {
for(auto [i,v]:query[y]){
ans[i] = uf.size(v);
}
for(auto [a,b]:road[y]){
uf.merge(a,b);
}
}
rep(i,q){
cout << ans[i] << endl;
}
}