#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define pb push_back #define pp pop_back #define f first #define s second #define mp make_pair #define sz(a) int((a).size()) #ifdef _WIN32 # define I64 "%I64d" #else # define I64 "%lld" #endif #define fname "." typedef long long ll; typedef unsigned long long ull; typedef pair < int, int > pi; const int MAX_N = (int)1e5 + 123; const int mod = (int)1e9 + 7; int binpow(int a, int b) { int res = 1; while(b) { if (b & 1) res = 1ll * res * a % mod; a = 1ll * a * a % mod; b >>= 1; } return res; } int n, q, a, b; int c[MAX_N]; struct tree { int val, len; tree() {} tree(int val, int len) : val(val), len(len) {} tree(int x) { val = 1ll * x * b % mod; len = 1; } tree operator + (const tree &B) { if (B.len == -1) return tree(val, len); if (len == -1) return B; int res = (len % 2 == 0 ? B.val : mod - B.val); res = 1ll * res * binpow(b, len) % mod; res += 1ll * val * binpow(a, B.len) % mod; if (res >= mod) res -= mod; return tree(res, len + B.len); } } t[4 * MAX_N]; void build(int v = 1, int tl = 0, int tr = n - 1) { if (tl == tr) { t[v] = tree(c[tl]); return; } int tm = (tl + tr) / 2; build(v * 2, tl, tm), build(v * 2 + 1, tm + 1, tr); t[v] = t[v * 2] + t[v * 2 + 1]; } void update(int x, int y, int v = 1, int tl = 0, int tr = n - 1) { if (tl == tr) { c[x] = y; t[v] = tree(y); return; } int tm = (tl + tr) / 2; if (x <= tm) update(x, y, v * 2, tl, tm); else update(x, y, v * 2 + 1, tm + 1, tr); t[v] = t[v * 2] + t[v * 2 + 1]; } tree get(int l, int r, int v = 1, int tl = 0, int tr = n - 1) { if (tl > r || l > tr || l > r) return tree(0, -1); if (tl >= l && tr <= r) { // cout << "hey " << t[v].val << " and " << c[tl] << endl; return t[v]; } int tm = (tl + tr) / 2; return get(l, r, v * 2, tl, tm) + get(l, r, v * 2 + 1, tm + 1, tr); } int main() { #ifdef Nick freopen(fname"in","r",stdin); freopen(fname"out","w",stdout); #endif scanf("%d%d%d%d", &n, &a, &b, &q); for (int i = 0; i < n; i++) scanf("%d", &c[i]); build(); for (int i = 0; i < q; i++) { int tp; scanf("%d", &tp); if (tp == 1) { int id, x; scanf("%d%d", &id, &x); update(id, x); } else { int l, r; scanf("%d%d", &l, &r); int now = get(l + 1, r).val; // cout << "hey " << now << endl; now = 1ll * now * binpow(binpow(a, r - l), mod - 2) % mod; if (now == c[l]) puts("Yes"); else puts("No"); } } return 0; }