def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) Q = int(data[idx+1]) idx +=2 A = list(map(int, data[idx:idx+N])) idx +=N S = data[idx] idx +=1 t_list = list(map(int, data[idx:idx+Q])) idx +=Q max_bit = 30 # since A_i and t_i can be up to 1e9 which is <2^30 # Precompute operations: convert to list of 0 or 1 (AND/OR) ops = [0]*N for i in range(N): ops[i] = 0 if S[i] == '0' else 1 # Precompute each bit's A values for all operations # A_bits[b][i] = (A[i] >> b) & 1 A_bits = [ [0]*N for _ in range(max_bit+1) ] for b in range(max_bit+1): mask = 1 << b for i in range(N): A_bits[b][i] = (A[i] & mask) != 0 # For each bit b, precompute sum_delta for initial 0 and 1 bit_scores = [[0, 0] for _ in range(max_bit+1)] for b in range(max_bit+1): # Initial x=0 current = 0 sum_delta0 = 0 for i in range(N): a = A_bits[b][i] op = ops[i] prev = current if op == 0: current = prev & a else: current = prev | a sum_delta0 += abs(current - prev) # Initial x=1 current = 1 sum_delta1 = 0 for i in range(N): a = A_bits[b][i] op = ops[i] prev = current if op == 0: current = prev & a else: current = prev | a sum_delta1 += abs(current - prev) multiplier = 1 << b bit_scores[b][0] = sum_delta0 * multiplier bit_scores[b][1] = sum_delta1 * multiplier # Process each query results = [] for t in t_list: total = 0 for b in range(max_bit+1): if t & (1 << b): total += bit_scores[b][1] else: total += bit_scores[b][0] results.append(total) print('\n'.join(map(str, results))) if __name__ == "__main__": main()