#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; const int Maxn = 100005; const int Maxm = 524288; const int mod = 1000000007; struct node { int val, len; }; int n, a, b, q; int bda; int c[Maxn]; node st[Maxm]; int toPower(int a, int p) { int res = 1; while (p) { if (p & 1) res = ll(res) * a % mod; p >>= 1; a = ll(a) * a % mod; } return res; } int Inv(int a) { return toPower(a, mod - 2); } void Union(const node &a, const node &b, node &c) { c.len = a.len + b.len; int my = ll(b.val) * toPower(bda, a.len) % mod; if (a.len % 2) my = (mod - my) % mod; c.val = (a.val + my) % mod; } void Create(int v, int l, int r) { if (l == r) { st[v].val = c[l]; st[v].len = 1; } else { int m = l + r >> 1; Create(2 * v, l, m); Create(2 * v + 1, m + 1, r); Union(st[2 * v], st[2 * v + 1], st[v]); } } void Update(int v, int l, int r, int x, int val) { if (l == r) st[v].val = val; else { int m = l + r >> 1; if (x <= m) Update(2 * v, l, m, x, val); else Update(2 * v + 1, m + 1, r, x, val); Union(st[2 * v], st[2 * v + 1], st[v]); } } void Get(int v, int l, int r, int a, int b, node &res) { if (l == a && r == b) res = st[v]; else { int m = l + r >> 1; if (b <= m) Get(2 * v, l, m, a, b, res); else if (m + 1 <= a) Get(2 * v + 1, m + 1, r, a, b, res); else { node tmp1, tmp2; Get(2 * v, l, m, a, m, tmp1); Get(2 * v + 1, m + 1, r, m + 1, b, tmp2); Union(tmp1, tmp2, res); } } } int main(){ scanf("%d %d %d %d", &n, &a, &b, &q); for(int c_i = 0; c_i < n; c_i++) scanf("%d", &c[c_i]); bda = ll(b) * Inv(a) % mod; Create(1, 0, n - 1); for(int a0 = 0; a0 < q; a0++){ int queryType; int first; int second; cin >> queryType >> first >> second; if (queryType == 1) Update(1, 0, n - 1, first, second); else { node res; Get(1, 0, n - 1, first, second, res); printf("%s\n", res.val == 0? "Yes": "No"); } } return 0; }