Here is the offline query implementation:
function edgeLimitedPaths(n, edges, queries):
// Sort edges by weight
sortedEdges = sort edges by weight ascending
// Sort queries by limit, keeping original indices
indexedQueries = [(limit, u, v, idx) for idx, (u, v, limit) in enumerate(queries)]
sort indexedQueries by limit ascending
parent = array [0, 1, 2, ..., n-1]
answer = array of size queries.length
edgePtr = 0
for (limit, u, v, idx) in indexedQueries:
// Add all edges with weight < limit
while edgePtr < edges.length and sortedEdges[edgePtr].weight < limit:
(a, b, w) = sortedEdges[edgePtr]
union(a, b)
edgePtr = edgePtr + 1
// Check if u and v are connected
answer[idx] = (find(u) == find(v))
return answer
Time: for sorting. Space: for Union-Find.