#!/bin/python import sys mod = 10 ** 9 + 7 def inverse(x): # reference: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm data = [] data.append([0, mod, 1, 0]) data.append([0, x, 0, 1]) i = 1 while data[i][1]: i += 1 q = data[i-2][1] / data[i-1][1] data.append([ q, data[i-2][1] - q * data[i-1][1], data[i-2][2] - q * data[i-1][2], data[i-2][3] - q * data[i-1][3], ]) return ((data[i-1][3] % mod) + mod) % mod def inc(pos, diff): b = 0 while (1 << b) <= n: itv = 1 << b tree[b][pos - pos % itv] = (tree[b][pos - pos % itv] + diff) % mod b += 1 def update(pos, val): diff = (val * x[pos] + mod - z[pos]) % mod c[pos] = val z[pos] = val * x[pos] % mod inc(pos, diff) def msb(n): count = 0 while n: count += 1 n >>= 1 return count def interval(msb, l, r): if l > r: return 0 itv = 1 << msb start = l - l % itv end = start + itv - 1 if l <= start and end <= r: return interval(msb-1, l, start - 1) + tree[msb][start] + interval(msb-1, end + 1, r) else: return interval(msb-1, l, r) def query(l, r): if a == 0: return True if b == 0: return c[l] == 0 return interval(msb(n), l, r) % mod == 0 def init(): power = 1 for i in xrange(n): x[i] = power power = power * (mod-b) * inverse(a) % mod z[i] = c[i] * x[i] % mod n,a,b,q = map(int, raw_input().strip().split(' ')) c_temp = map(int, raw_input().strip().split(' ')) c = [0] * n x = [0] * n z = [0] * n tree = [[0] * n for i in xrange(msb(n)+10)] init() for i in xrange(n): update(i, c_temp[i]) for a0 in xrange(q): queryType,first,second = raw_input().strip().split(' ') queryType,first,second = [int(queryType),int(first),int(second)] if queryType == 1: update(pos, val) else: print 'Yes' if query(first, second) else 'No' # your code goes here