from sys import stdin input = stdin.readline from types import GeneratorType def bootstrap(f, stack=[]): def wrappedfunc(*args, **kwargs): if stack: return f(*args, **kwargs) to = f(*args, **kwargs) while True: if type(to) is GeneratorType: stack.append(to) to = next(to) else: stack.pop() if not stack: break to = stack[-1].send(to) return to return wrappedfunc @bootstrap def dfs(n, p): SUM = 0 for v in G[n]: if v == p: continue yield dfs(v, n) SUM ^= S[v-1] if 1 <= n: A[n] = SUM^S[n-1] yield def op_xor(x, y): return x^y def op_bool(x, y): return x|y class UnionFind: def __init__(self, n, A, op): self.n = n self.parent_size = [-1]*n self.A = A[:] self.op = op def leader(self, a): if self.parent_size[a] < 0: return a self.parent_size[a] = self.leader(self.parent_size[a]) return self.parent_size[a] def merge(self, a, b): x, y = self.leader(a), self.leader(b) if x == y: return l, r = self.A[x], self.A[y] if abs(self.parent_size[x]) < abs(self.parent_size[y]): x, y = y, x self.parent_size[x] += self.parent_size[y] self.parent_size[y] = x self.A[x] = self.op(l, r) return def __getitem__(self, n): return self.A[self.leader(n)] def update(self, n, a): self.A[self.leader(n)] = a def same(self, a, b): return self.leader(a) == self.leader(b) def size(self, a): return abs(self.parent_size[self.leader(a)]) def groups(self): result = [[] for _ in range(self.n)] for i in range(self.n): result[self.leader(i)].append(i) return [r for r in result if r != []] N = int(input()) P = list(map(int, input().split())) S = input().rstrip("\n") K = int(input()) op = [list(map(int, input().split())) for _ in range(K)] S = [0 if s == "." else 1 for s in S] G = [[] for _ in range(N)] for i, p in enumerate(P): p -= 1 G[p].append(i+1) G[i+1].append(p) A = [0]*N dfs(0, -1) UFX = UnionFind(N, A, op_xor) UFB = UnionFind(N, [i == 0 for i in range(N)], op_bool) for u, v in op: u, v = u-1, v-1 UFX.merge(u, v) UFB.merge(u, v) for i in range(N): if UFX.leader(i) != i: continue if not UFB[i] and UFX[i] == 1: print("No") break else: print("Yes")