import sys def main(): data = sys.stdin.read().split() it = iter(data) n, q, P = map(int, (next(it), next(it), next(it))) A = [int(next(it)) % P for _ in range(n)] qs = [[] for _ in range(n)] ans = [''] * q for idx in range(q): L = int(next(it)) - 1 R = int(next(it)) - 1 K = int(next(it)) qs[R].append((idx, K, L)) # dp[r] = 用前缀能凑出乘积 ≡ r (mod P) 的子集时,这些子集的最小下标中的最大值 dp = [0] * P for i, a in enumerate(A, start=1): pre = dp[:] # 保留上一次的状态 # 用旧状态往前转移:选上一次能凑出 r 的子集,再乘上 a for r, pos in enumerate(pre): if pos: nr = (r * a) % P if dp[nr] < pos: dp[nr] = pos # 单独只选 A[i] 这一个 if dp[a] < i: dp[a] = i # 回答所有 R == i-1 的查询 for idx, K, L in qs[i-1]: ans[idx] = 'Yes' if dp[K] >= L+1 else 'No' sys.stdout.write('\n'.join(ans)) if __name__ == '__main__': main()