//start of jonathanirvings' template v3.0.3 (BETA) #include using namespace std; typedef long long LL; typedef pair pii; typedef pair pll; typedef pair pss; typedef vector vi; typedef vector vvi; typedef vector vii; typedef vector vl; typedef vector vvl; double EPS = 1e-9; int INF = 1000000005; long long INFF = 1000000000000000005LL; double PI = acos(-1); int dirx[8] = {-1,0,0,1,-1,-1,1,1}; int diry[8] = {0,1,-1,0,-1,1,-1,1}; #ifdef TESTING #define DEBUG fprintf(stderr,"====TESTING====\n") #define VALUE(x) cerr << "The value of " << #x << " is " << x << endl #define debug(...) fprintf(stderr, __VA_ARGS__) #else #define DEBUG #define VALUE(x) #define debug(...) #endif #define FOR(a,b,c) for (int (a)=(b);(a)<(c);++(a)) #define FORN(a,b,c) for (int (a)=(b);(a)<=(c);++(a)) #define FORD(a,b,c) for (int (a)=(b);(a)>=(c);--(a)) #define FORSQ(a,b,c) for (int (a)=(b);(a)*(a)<=(c);++(a)) #define FORC(a,b,c) for (char (a)=(b);(a)<=(c);++(a)) #define FOREACH(a,b) for (auto &(a) : (b)) #define REP(i,n) FOR(i,0,n) #define REPN(i,n) FORN(i,1,n) #define MAX(a,b) a = max(a,b) #define MIN(a,b) a = min(a,b) #define SQR(x) ((LL)(x) * (x)) #define RESET(a,b) memset(a,b,sizeof(a)) #define fi first #define se second #define mp make_pair #define pb push_back #define ALL(v) v.begin(),v.end() #define ALLA(arr,sz) arr,arr+sz #define SIZE(v) (int)v.size() #define SORT(v) sort(ALL(v)) #define REVERSE(v) reverse(ALL(v)) #define SORTA(arr,sz) sort(ALLA(arr,sz)) #define REVERSEA(arr,sz) reverse(ALLA(arr,sz)) #define PERMUTE next_permutation #define TC(t) while(t--) inline string IntToString(LL a){ char x[100]; sprintf(x,"%lld",a); string s = x; return s; } inline LL StringToInt(string a){ char x[100]; LL res; strcpy(x,a.c_str()); sscanf(x,"%lld",&res); return res; } inline string GetString(void){ char x[1000005]; scanf("%s",x); string s = x; return s; } inline string uppercase(string s){ int n = SIZE(s); REP(i,n) if (s[i] >= 'a' && s[i] <= 'z') s[i] = s[i] - 'a' + 'A'; return s; } inline string lowercase(string s){ int n = SIZE(s); REP(i,n) if (s[i] >= 'A' && s[i] <= 'Z') s[i] = s[i] - 'A' + 'a'; return s; } inline void OPEN (string s) { #ifndef TESTING freopen ((s + ".in").c_str (), "r", stdin); freopen ((s + ".out").c_str (), "w", stdout); #endif } //end of jonathanirvings' template v3.0.3 (BETA) int n,q,a,b; LL k[100005]; LL inv[100005]; LL MOD = 1e9 + 7; LL tree[400005]; int x,y,z; LL modpow(LL a,LL b) { if (b == 0) return 1; if (b == 1) return a % MOD; LL temp = modpow(a,b/2); LL temp2 = (temp * temp) % MOD; if (b % 2 == 0) return temp2; return (temp2 * a) % MOD; } void update(int ix,int L,int R,int pos,int val) { if (L == R) { tree[ix] = val % MOD; return; } int M = (L + R) >> 1; if (pos <= M) update(ix*2+1,L,M,pos,val); else update(ix*2+2,M+1,R,pos,val); tree[ix] = (tree[ix*2+1]+k[M-L+1]*tree[ix*2+2])%MOD; //debug("%d %d %lld %lld %lld\n",L,R,tree[ix*2+1],tree[ix*2+2],tree[ix]); } pair query(int ix,int L,int R,int x,int y) { if (x <= L && R <= y) return mp(tree[ix],R-L+1); if (R < x || y < L) return mp(0,0); int M = (L + R) >> 1; pair satu = query(ix*2+1,L,M,x,y); pair dua = query(ix*2+2,M+1,R,x,y); return mp((satu.fi+k[satu.se]*dua.fi)%MOD,satu.se+dua.se); } int main() { scanf("%d %d %d %d",&n,&a,&b,&q); k[0] = 1; LL kali = (-b) * modpow(a,MOD-2) % MOD; if (kali < 0) kali += MOD; FORN(i,1,n) { k[i] = k[i-1] * kali % MOD; //debug("%d %lld\n",i,k[i]); } REP(i,n) { scanf("%d",&x); update(0,0,n-1,i,x); } TC(q) { scanf("%d %d %d",&x,&y,&z); if (x == 1) update(0,0,n-1,y,z); else{ LL temp = query(0,0,n-1,y,z).fi; puts(temp ? "No" : "Yes"); } } return 0; }