#include #include using namespace std; #define MOD 1000000007 #define MAX 100005 long long powmod(long long a, long long e) { long long ret = 1; for (; e; e >>= 1, a = a * a % MOD) if (e & 1) ret = ret * a % MOD; return ret; } long long invmod(long long a) { return powmod(a, MOD-2); } int n, a, b, c[MAX], q; long long tree[4*MAX]; void init(int no, int l, int r) { if (l == r) { tree[no] = c[l]; return; } int m = (l + r) / 2; init(2*no, l, m); init(2*no+1, m+1, r); int e = m+1 - l, sgn = e % 2 == 0 ? 1 : -1; tree[no] = ((sgn * tree[2*no+1] * powmod(b, e) % MOD) * invmod(powmod(a, e)) % MOD + tree[2*no]) % MOD; } void update(int no, int l, int r, int k, int val) { if (l == r) { tree[no] = val; return; } int m = (l + r) / 2; if (k <= m) update(2*no, l, m, k, val); else update(2*no+1, m+1, r, k, val); int e = m+1 - l, sgn = e % 2 == 0 ? 1 : -1; tree[no] = ((sgn * tree[2*no+1] * powmod(b, e) % MOD) * invmod(powmod(a, e)) % MOD + tree[2*no]) % MOD; } long long query(int no, int l, int r, int i, int j) { if (i <= l && r <= j) return tree[no]; int m = (l + r) / 2; if (j <= m) return query(2*no, l, m, i, j); if (m+1 <= i) return query(2*no+1, m+1, r, i, j); long long s = query(2*no, l, m, i, j); long long t = query(2*no+1, m+1, r, i, j); int e = (m+1) - max(i, l), sgn = e % 2 == 0 ? 1 : -1; return ((sgn * t * powmod(b, e) % MOD) * invmod(powmod(a, e)) % MOD + s) % MOD; } int main() { scanf("%d %d %d %d", &n, &a, &b, &q); for (int i = 0; i < n; i++) scanf("%d", &c[i]); init(1, 0, n-1); while (q--) { int op, s, t; scanf("%d %d %d", &op, &s, &t); if (op == 1) update(1, 0, n-1, s, t); else { if (query(1, 0, n-1, s, t) == 0) puts("Yes"); else puts("No"); } } }