//satyaki3794 #include #define ff first #define ss second #define pb push_back #define MOD (1000000007LL) #define LEFT(n) (2*(n)) #define RIGHT(n) (2*(n)+1) using namespace std; typedef long long ll; typedef pair ii; typedef pair iii; ll pwr(ll base, ll p, ll mod = MOD){ ll ans = 1;while(p){if(p&1)ans=(ans*base)%mod;base=(base*base)%mod;p/=2;}return ans; } ll gcd(ll a, ll b){ if(b == 0) return a; return gcd(b, a%b); } struct segnode{ ll sz, ans; segnode(){} segnode(ll sz, ll ans){ this->sz = sz; this->ans = ans; } }tree[400005]; int n; ll arr[100005], powers[100005]; segnode merge(segnode &b, segnode &c){ segnode a; a.sz = b.sz + c.sz; a.ans = b.ans + powers[b.sz]*c.ans; a.ans %= MOD; return a; } void build(int node, int s, int e){ if(s > e) return; if(s == e){ tree[node] = segnode(1, arr[s]); return; } int mid = (s+e)/2; build(LEFT(node), s, mid); build(RIGHT(node), mid+1, e); tree[node] = merge(tree[LEFT(node)], tree[RIGHT(node)]); } void update(int node, int s, int e, int pos, ll val){ if(s > e || pos < s || pos > e) return; if(s == e){ tree[node] = segnode(1, val); return; } int mid = (s+e)/2; update(LEFT(node), s, mid, pos, val); update(RIGHT(node), mid+1, e, pos, val); tree[node] = merge(tree[LEFT(node)], tree[RIGHT(node)]); } segnode query(int node, int s, int e, int lo, int hi){ if(s > e || lo > e || s > hi) return segnode(0, 0); if(s >= lo && e <= hi) return tree[node]; int mid = (s+e)/2; segnode a = query(LEFT(node), s, mid, lo, hi); segnode b = query(RIGHT(node), mid+1, e, lo, hi); return merge(a, b); } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int q; ll a, b; cin>>n>>a>>b>>q; ll value = (-b) * pwr(a, MOD-2); value %= MOD; value += MOD; value %= MOD; // cout<>arr[i]; build(1, 1, n); // cout<<"tree: ";for(int i=1;i<=5;i++) cout<>op; if(op == 1){ int pos; ll val; cin>>pos>>val; pos++; update(1, 1, n, pos, val); } else{ int l, r; cin>>l>>r; l++; r++; ll ans = query(1, 1, n, l, r).ans; if(ans%MOD == 0) cout<<"Yes\n"; else cout<<"No\n"; } } return 0; }