To reword the problem more precisely, we have an undirected weighted tree. Define $f(v, w)$ to be the minimum weight over all edges on the path from $v$ to $w$. We want to answer several queries for a given vertex $v$ and $k$ of the form - how many vertices $w$ exist where $f(v, w) \ge k$?
To answer this query for a given vertex, we can start by doing a BFS from $v$. We never want to traverse an edge with edge weight strictly less than $k$, so we ignore those edges. We can then count how many other vertices we have visited.
import java.io.*;
import java.util.*;
public class mootube {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("mootube.in"));
PrintWriter pw = new PrintWriter(new BufferedWriter(new FileWriter("mootube.out")));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int q = Integer.parseInt(st.nextToken());
LinkedList<Edge>[] edges = new LinkedList[n];
for(int i = 0; i < n; i++) {
edges[i] = new LinkedList<Edge>();
}
for(int a = 1; a < n; a++) {
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken())-1;
int y = Integer.parseInt(st.nextToken())-1;
int w = Integer.parseInt(st.nextToken());
edges[x].add(new Edge(y, w));
edges[y].add(new Edge(x, w));
}
for(int query = 0; query < q; query++) {
st = new StringTokenizer(br.readLine());
int threshold = Integer.parseInt(st.nextToken());
int start = Integer.parseInt(st.nextToken())-1;
int ret = 0;
LinkedList<Integer> queue = new LinkedList<Integer>();
queue.add(start);
boolean[] seen = new boolean[n];
seen[start] = true;
while(!queue.isEmpty()) {
int curr = queue.removeFirst();
for(Edge out: edges[curr]) {
if(!seen[out.d] && out.w >= threshold) {
seen[out.d] = true;
queue.add(out.d);
ret++;
}
}
}
pw.println(ret);
}
pw.close();
}
static class Edge {
public int d, w;
public Edge(int a, int b) {
d=a;
w=b;
}
}
}