#include using namespace std; typedef long long ll; typedef long double ld; ll binaryPow(ll x, ll y, ll MOD) { if (y == 0) return 1; if ((y & 1) == 0) { ll tmp = binaryPow(x, y / 2, MOD); return (tmp * tmp) % MOD; } else { return binaryPow(x, y - 1, MOD) * x % MOD; } } ll moduloInverse(ll x, ll MOD) { return binaryPow(x, MOD - 2, MOD); } const int MAXN = 100 * 1000 + 7; const ll MOD = 1000 * 1000 * 1000 + 7; ll xpow[MAXN]; ll a[MAXN]; pair merge(pair l, pair r) { return make_pair((l.first + r.first * xpow[l.second]) % MOD, l.second + r.second); } struct segmentTree { vector > t; segmentTree(int n) { t.resize(4 * n + 5); } void c(int v, int tl, int tr, int pos, ll val) { if (tl == tr) { t[v] = make_pair(val, 1); } else { int tm = (tl + tr) >> 1; if (pos <= tm) { c(v + v, tl, tm, pos, val); } else { c(v + v + 1, tm + 1, tr, pos, val); } t[v] = merge(t[v + v], t[v + v + 1]); } } pair g(int v, int tl, int tr, int l, int r) { if (r < tl || l > tr) return make_pair(0, 0); if (tl >= l && tr <= r) return t[v]; int tm = (tl + tr) / 2; return merge(g(v + v, tl, tm, l, r), g(v + v + 1, tm + 1, tr, l, r)); } }; int main() { #ifdef LOCAL freopen("input.txt", "r", stdin); #endif int n, q; ll a, b; scanf("%d %lld %lld %d", &n, &a, &b, &q); if (a == 0) { if (b == 0) { for (int i = 1; i <= q; i++) { printf("No\n"); } } else { for (int i = 1; i <= q; i++) { printf("Yes\n"); } } return 0; } ll x = (MOD - b) * moduloInverse(a, MOD) % MOD; xpow[0] = 1; for (int i = 1; i < MAXN; i++) { xpow[i] = (xpow[i - 1] * x) % MOD; } segmentTree st(n + 3); for (int i = 1; i <= n; i++) { ll xx; scanf("%lld", &xx); st.c(1, 1, n, i, xx); } for (int i = 1; i <= q; i++) { int type; scanf("%d", &type); if (type == 1) { int pos, val; scanf("%d %d", &pos, &val); pos++; st.c(1, 1, n, pos, val); } else { int l, r; scanf("%d %d", &l, &r); l++, r++; pair xx = st.g(1, 1, n, l, r); // cerr << xx.first << endl; if (xx.first == 0) { printf("Yes\n"); } else { printf("No\n"); } } } }