#include using namespace std; typedef long long LL; typedef pair II; const int N = (int) 1e5 + 10; const int P = (int) 1e9 + 7; int n, a, b, q, c[N]; int E[N], B; #define m ((l + r) >> 1) struct SegmentTree { int ST[N * 5]; void Build(int k, int l, int r) { if (l == r) { ST[k] = c[l]; return; } Build(k << 1, l, m); Build(k << 1 | 1, m + 1, r); ST[k] = (ST[k << 1] + (LL) ST[k << 1 | 1] * E[m - l + 1]) % P; } int Query(int k, int l, int r, int i, int j) { if (l == i && j == r) return ST[k]; if (j <= m) return Query(k << 1, l, m, i, j); if (i > m) return Query(k << 1 | 1, m + 1, r, i, j); return (Query(k << 1, l, m, i, m) + (LL) Query(k << 1 | 1, m + 1, r, m + 1, j) * E[m - i + 1]) % P; } void Update(int k, int l, int r, int i, int x) { if (l == r) { ST[k] = x; return; } if (i <= m) Update(k << 1, l, m, i, x); else Update(k << 1 | 1, m + 1, r, i, x); ST[k] = (ST[k << 1] + (LL) ST[k << 1 | 1] * E[m - l + 1]) % P; } } ST; #undef m int Power(int a, int k) { int ans = 1; while (k) { if (k & 1) ans = (LL) ans * a % P; k >>= 1; a = (LL) a * a % P; } return ans; } int main() { #ifdef LOCAL freopen("Data.inp", "r", stdin); freopen("Data.out", "w", stdout); #endif scanf("%d%d%d%d", &n, &a, &b, &q); for (int i = 1; i <= n; ++i) scanf("%d", &c[i]); B = LL(P - b) * Power(a, P - 2) % P; E[0] = 1; for (int i = 1; i <= n; ++i) E[i] = (LL) E[i - 1] * B % P; ST.Build(1, 1, n); while (q--) { int type; scanf("%d", &type); if (type == 1) { int i, x; scanf("%d%d", &i, &x); i++; ST.Update(1, 1, n, i, x); } else { int l, r; scanf("%d%d", &l, &r); l++; r++; puts(ST.Query(1, 1, n, l, r) == 0 ? "Yes" : "No"); } } return 0; }