#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define ws ws_____________________ #define y1 y1_____________________ #define y0 y0_____________________ #define left left_________________ #define right right_______________ #define next next_________________ #define prev prev_________________ #define hash hash_________________ #define pb push_back #define fst first #define snd second #define mp make_pair #define sz(C) ((int) (C).size()) #define forn(i, n) for (int i = 0; i < int(n); ++i) #define ford(i, n) for (int i = int(n) - 1; i >= 0; --i) #define all(C) begin(C), end(C) typedef long long ll; typedef unsigned long long ull; typedef unsigned int uint; typedef pair pii; typedef pair pll; typedef vector vll; typedef vector vi; typedef vector vvi; typedef vector vii; typedef long double ld; typedef complex cd; #define FILE_NAME "a" const int MOD = 1e9 + 7; void add(int& x, int y) { ((x += y) >= MOD) && (x -= MOD); } int mul(int x, int y) { return x * 1ll * y % MOD; } int mpow(int a, int p) { int res = 1; for (; p > 0; a = mul(a, a), p >>= 1) { if (p & 1) { res = mul(res, a); } } return res; } int inv(int x) { assert(x); int y = mpow(x, MOD - 2); assert(mul(x, y) == 1); return y; } struct FenwTree { vi t; FenwTree(int n = 0) { t.assign(n, 0); } int get(int r) { int res = 0; for (int i = r; i >= 0; i &= i + 1, --i) { add(res, t[i]); } return res; } int get(int l, int r) { int R = get(r); int L = get(l - 1); add(R, -L + MOD); return R; } void upd(int pos, int val) { for (int i = pos; i < sz(t); i |= i + 1) { add(t[i], val); } } }; int n, a, b, q; vi c; bool read() { if (scanf("%d%d%d%d", &n, &a, &b, &q) < 4) { return 0; } c.resize(n); forn(i, n) { scanf("%d", &c[i]); } return 1; } void solve() { int alpha = mul(b, inv(a)); alpha = (-alpha + MOD) % MOD; FenwTree T(n); vi pows(n + 1, 1); forn(i, n) { pows[i + 1] = mul(pows[i], alpha); } forn(i, n) { T.upd(i, mul(c[i], pows[i])); } forn(it, q) { int t; scanf("%d", &t); if (t == 1) { int i, x; scanf("%d%d", &i, &x); int old = (-mul(c[i], pows[i]) + MOD) % MOD; T.upd(i, old); c[i] = x; T.upd(i, mul(c[i], pows[i])); } else { int l, r; scanf("%d%d", &l, &r); bool yes = 0; if (b == 0) { yes = (c[l] == 0); } else { int val = T.get(l, r); assert(alpha); val = mul(val, inv(mpow(alpha, l))); yes = val == 0; } puts(yes ? "Yes" : "No"); } } } int main() { #ifdef LOCAL freopen(FILE_NAME ".in", "r", stdin); // freopen(FILE_NAME ".out", "w", stdout); #endif while (read()) { solve(); } #ifdef LOCAL cerr.precision(5); cerr << "Time: " << fixed << (double) clock() / CLOCKS_PER_SEC << endl; #endif return 0; }