#yukicoder389D もしかして、真?_AfterContest ''' 並行二分探索木が必要だよなと思っていましたが実際に必要ですね。 しかたないので実装しましょう。 でもnodeを直接覗けばいいのか。うん・・・ ''' #Segment Tree: O(logN) class SegmentTree: def __init__(self,n,identity_e,combine_f): self._n=n;self._size=1 while self._size>=1;self._node[i]=self._combine_f(self._node[i<<1|0],self._node[i<<1|1]) def fold(self,L,R): #区間取得: [L,R)の区間値を得る L+=self._size;R+=self._size;vL,vR=[self._identity_e]*2 while L>=1;R>>=1 return self._combine_f(vL,vR) add =lambda x,y:x+y oand=lambda x,y:x&y oor =lambda x,y:x|y oxor=lambda x,y:x^y oimp=lambda x,y:y if x else True for _ in range(int(input())): N=int(input()); X=list(map(lambda x:x=='True', input().split())) Y=input().split(); S=list(map(int,input().split())) ST=SegmentTree(N,0,add); ST.build([1]*N) #手動で平衡二分探索木 区間[0,x)がちょうどiとなる最大のiを求めよ for i in S: cntL,cntR=0,0; Lt,Rt=1,1; size=ST._size #cnt: 現在の区間より左側にある値の数 while Lt=i: Lt=Lt<<1|0 else: cntL+=ST._node[Lt<<1|0]; Lt=Lt<<1|1 if cntR+ST._node[Rt<<1|0]>=i+1: Rt=Rt<<1|0 else: cntR+=ST._node[Rt<<1|0]; Rt=Rt<<1|1 Lt-=size; Rt-=size; ST.update(Rt,0) #演算子を使用したRt側を削除するよう変更 if Y[Rt-1]=='and': X[Lt]=oand(X[Lt],X[Rt]) elif Y[Rt-1]=='or' : X[Lt]=oor (X[Lt],X[Rt]) elif Y[Rt-1]=='xor': X[Lt]=oxor(X[Lt],X[Rt]) elif Y[Rt-1]=='imp': X[Lt]=oimp(X[Lt],X[Rt]) print(X[Lt])