import heapq def dijkstra(adj_list, start): dist = {v: float('inf') for v in adj_list} dist[start] = 0 heap = [(0, start)] while heap: d, u = heapq.heappop(heap) if d > dist[u]: continue for v, w in adj_list[u]: if d + w < dist[v]: dist[v] = d + w heapq.heappush(heap, (dist[v], v)) return dist def calculate_distances(adj_list): dist_sum = 0 for i in range(len(adj_list)): dist = dijkstra(adj_list, i) for j in range(i+1, len(adj_list)): dist_sum += dist[j] return dist_sum def calculate_new_distances(adj_list, w, e, a, b): w_dist = dijkstra(adj_list, a) e_dist = dijkstra(adj_list, w + b) new_dist_sum = 0 for i in range(w): for j in range(e): if i == a-1 and j == b-1: continue if i == a-1: dist = e_dist[w+j] elif j == b-1: dist = w_dist[i] else: dist = w_dist[i] + e_dist[w+j] + 1 new_dist_sum += dist return new_dist_sum T = int(input()) for t in range(1, T+1): W, E, C = map(int, input().split()) w_connections = [[] for _ in range(W)] for i, x in enumerate(map(int, input().split())): w_connections[i].append((x-1, 1)) w_connections[x-1].append((i, 1)) e_connections = [[] for _ in range(E)] for j, f in enumerate(map(int, input().split())): e_connections[j].append((f-1, 1)) e_connections[f-1].append((j, 1)) dist_sum = calculate_distances(w_connections) + calculate_distances(e_connections) results = [] for _ in range(C): a, b = map(int, input().split()) new_dist_sum = calculate_new_distances(w_connections + e_connections, W, E, a-1, b-1) avg_dist = new_dist_sum / ((