import bisect def main(): import sys input = sys.stdin.read data = input().split() idx = 0 N = int(data[idx]) Q = int(data[idx+1]) P = int(data[idx+2]) idx +=3 A = list(map(int, data[idx:idx+N])) idx +=N # Precompute prefix_zeros prefix_zeros = [0]*(N+1) for i in range(N): prefix_zeros[i+1] = prefix_zeros[i] + (A[i] == 0) # Precompute non_zero_positions and their values mod P non_zero_positions = [] non_zero_values = [] for i in range(N): if A[i] !=0: non_zero_positions.append(i+1) # 1-based index non_zero_values.append(A[i] % P) # Precompute multiplication table mul_table = [[0]*P for _ in range(P)] for j in range(P): for a in range(P): mul_table[j][a] = (j * a) % P # Process queries for _ in range(Q): L = int(data[idx]) R = int(data[idx+1]) K = int(data[idx+2]) idx +=3 if K ==0: if prefix_zeros[R] - prefix_zeros[L-1] >0: print("Yes") else: print("No") else: # Find non-zero elements in [L, R] left = bisect.bisect_left(non_zero_positions, L) right = bisect.bisect_right(non_zero_positions, R) elements = non_zero_values[left:right] if not elements: print("No") continue # Compute DP mask = 0 for a in elements: multiplied_mask = 0 j = mask while j: lsb = j & -j bit = (lsb).bit_length() -1 multiplied_mask |= (1 << mul_table[bit][a]) j ^= lsb new_mask = mask | multiplied_mask | (1 << a) mask = new_mask if (mask & (1 << K)) !=0: print("Yes") else: print("No") if __name__ == "__main__": main()