class SegmentTree: def __init__(self, init_val, segfunc, ide_ele): n = len(init_val) self.segfunc = segfunc self.ide_ele = ide_ele self.num = 1 << (n - 1).bit_length() self.tree = [ide_ele] * 2 * self.num self.size = n for i in range(n): self.tree[self.num + i] = init_val[i] for i in range(self.num - 1, 0, -1): self.tree[i] = self.segfunc(self.tree[2 * i], self.tree[2 * i + 1]) def update(self, k, x): k += self.num self.tree[k] = x while k > 1: k >>= 1 self.tree[k] = self.segfunc(self.tree[2*k], self.tree[2*k+1]) def query(self, l, r): if r==self.size: r = self.num res = self.ide_ele l += self.num r += self.num right = [] while l < r: if l & 1: res = self.segfunc(res, self.tree[l]) l += 1 if r & 1: right.append(self.tree[r-1]) l >>= 1 r >>= 1 for e in right[::-1]: res = self.segfunc(res,e) return res def solve(N,A,B,M,E): A = [a-1 for a in A] B = [b-1 for b in B] res = set() edge = [[] for v in range(N)] for u,v in E: edge[u-1].append(v-1) edge[v-1].append(u-1) group = [-1 for v in range(N)] for v in range(N): mex = [False for i in range(len(edge[v])+1)] for nv in edge[v]: if nv < v and group[nv] < len(mex): mex[group[nv]] = True for i in range(len(mex)): if not mex[i]: group[v] = i break n = max(group) + 1 clique = [[] for g in range(n)] for v in range(N): clique[group[v]].append(v) def direct(i,j): if i < j: return A[i] < B[j] else: return B[i] < A[j] def hamilton_path(V): n = len(V) if n <= 1: return V A = hamilton_path(V[:n//2]) B = hamilton_path(V[n//2:]) res = [] bi = 0 for ai in range(len(A)): while bi