class Fenwick_Tree: def __init__(self, N, A=None): self.N=N if A==None: self.data=[0]*N else: assert len(A)==N self.data=A self.__build() def __build(self): data=self.data for i in range(1, self.N+1): if i+(i&(-i))<=self.N: data[i+(i&(-i))-1]+=data[i-1] def add(self, i, x): i+=1 data=self.data while i<=self.N: data[i-1]+=x i+=i&(-i) def sum(self, i): S=0 data=self.data while i: S+=data[i-1] i-=i&(-i) return S def range_sum(self,l,r): return self.sum(r)-self.sum(l) def bisect_left(self, x, default=-1): i=0 k=1<>=1 return i if x else default def bisect_right(self, x, default=-1): i=0 k=1<>=1 return i if i=0: return self.Fenwick.bisect_left(self.Fenwick.sum(x), default) else: return default def next(self, x, mode=True, default=-1): """ S に含まれる x 以上の要素のうち, 最大値を求める. x: int mode: False のときは "以上" が "より大きい" になる. """ if not mode: x+=1 return self.Fenwick.bisect_right(self.Fenwick.sum(x), default) def less_count(self, x, mode=False): """ x 未満の元の個数を求める. x: int mode: mode=True ならば, "未満" が "以下" になる. """ if mode: x+=1 return self.Fenwick.sum(x) def more_count(self, x, mode=False): """ x より大きい元の個数を求める. x: int mode: mode=True ならば, "より大きい" が "以上" になる. """ return len(self)-self.less_count(x, not mode) def kth_min(self, k, default=-1): """ k 番目に小さい元を求める. """ if 1<=k<=len(self): return self[k-1] else: return default def kth_max(self, k, default=-1): """ k 番目に大きい元を求める. """ if 1<=k<=len(self): return self[~(k-1)] else: return default #================================================== class Doubly_Linked_List: def __init__(self, N): self.__N=N self.__front=[-1]*N self.__back=[-1]*N def __len__(self): return self.__N def __str__(self): res=[] used=[0]*self.__N for x in range(self.__N): if used[x]: continue a=self.enumerate(x) for y in a: used[y]=1 res.append(a) return str(res) def __repr__(self): return "[Doubly Linked List]: "+str(self) def previous(self, x, default=-1): return self.__front[x] if self.__front[x]!=-1 else default def next(self, x, default=-1): return self.__back[x] if self.__back[x]!=-1 else default def disconnect_front(self, x): """ x から前に伸びるリンクを削除する. """ front=self.__front; back=self.__back y=front[x] if y>=0: front[x]=-1 back[y]=-1 def disconnect_back(self, x): """ x から後ろに伸びるリンクを削除する. """ front=self.__front; back=self.__back y=back[x] if y>=0: back[x]=-1 front[y]=-1 def extract(self, x): """ x に接続するリンクを削除し, x の前後が存在するならば, それらをつなぐ. """ a=self.__front[x] b=self.__back[x] self.disconnect_front(x) self.disconnect_back(x) if a!=-1 and b!=-1: self.connect(a,b) def connect(self, x, y): """ x から y へのリンクを生成する (すでにある x からのリンクと y へのリンクは削除される). """ self.disconnect_back(x) self.disconnect_front(y) self.__back[x]=y self.__front[y]=x def insert_front(self, x, y): """ x の前に y を挿入する. """ z=self.__front[x] self.connect(y,x) if z!=-1: self.connect(z,y) def insert_back(self, x, y): """ x の後に y を挿入する. """ z=self.__back[x] self.connect(x,y) if z!=-1: self.connect(y,z) def head(self, x): """ x が属する弱連結成分の先頭を求める. """ while self.__front[x]!=-1: x=self.__front[x] return x def tail(self, x): """ x が属する弱連結成分の末尾を求める. """ while self.__back[x]!=-1: x=self.__back[x] return x def enumerate(self, x): """ x が属している弱連結成分を先頭から順に出力する. """ x=self.head(x) res=[x] while self.__back[x]>=0: x=self.__back[x] res.append(x) return res def depth(self, x): dep=0 while self.__front[x]!=-1: x=self.__front[x] dep+=1 return dep #================================================== def AND(x,y): return (x and y) def OR(x,y): return (x or y) def XOR(x,y): return (x^y) def IMP(x,y): return ((not x) or y) #================================================== def solve(): N=int(input()) X=list(input().split()) Y=list(input().split()) S=list(map(int,input().split())) A=[X[i]=="True" for i in range(N)] D=Doubly_Linked_List(N) for i in range(N-1): D.connect(i,i+1) U=Ordered_Set(N, S=[1]*N) for j in range(N-1): r=U.kth_min(S[j]+1) p=D.previous(r); q=r-1 if Y[q]=="and": op=AND elif Y[q]=="or": op=OR elif Y[q]=="xor": op=XOR else: op=IMP A[p]=op(A[p],A[r]) U.discard(r) D.extract(r) return A[0] #================================================== import sys input=sys.stdin.readline write=sys.stdout.write T=int(input()) write("\n".join(map(str,[solve() for _ in range(T)])))