#include using namespace std; const int MaxN = (int)1e7 + 10; const int INF = (int)1e9; const int MOD = (int)1e9 + 7; int inv[MaxN], fact[MaxN], rfact[MaxN]; int dp[MaxN], sdp[MaxN]; int main() { // freopen("input.txt", "r", stdin); int n, k, a, b, q; scanf("%d%d%d%d%d", &n, &k, &a, &b, &q); assert (1 <= n && n <= 1e7); assert (1 <= k && k <= MOD); assert (1 <= b && b <= MOD); assert (0 <= a && a <= MOD); assert (1 <= q && q <= 5e4); fact[0] = rfact[0] = 1; for (int i = 1; i < MaxN; ++i) { inv[i] = i == 1 ? 1 : 1LL * (MOD - MOD / i) * inv[MOD % i] % MOD; fact[i] = 1LL * i * fact[i - 1] % MOD; rfact[i] = 1LL * inv[i] * rfact[i - 1] % MOD; } dp[1] = k; for (int i = 2; i <= 10000; ++i) { int cur = 0; for (int j = 1; j < i; ++j) { cur = (cur + 1LL * dp[j] * dp[i - j]) % MOD; } dp[i] = (1LL * a * dp[i - 1] + 1LL * b * cur) % MOD; } long long x = 2LL * (2LL * k * b + a) % MOD; long long y = 3LL * (2LL * k * b + a) % MOD; long long z = 1LL * a * a % MOD; for (int i = 3; i <= n; ++i) { long long A = 1LL * dp[i - 1] * (1LL * x * i % MOD - y + MOD) % MOD; long long B = 1LL * dp[i - 2] * (i - 3) % MOD * z % MOD; long long C = 1LL * (A - B + MOD) % MOD * inv[i] % MOD; if (i <= 10000) { assert (dp[i] == C); } else { dp[i] = C; } } for (int i = 1; i <= n; ++i) { sdp[i] = (sdp[i - 1] + 1LL * dp[i] * dp[i]) % MOD; } while (q --> 0) { int l, r; scanf("%d%d", &l, &r); printf("%d\n", (sdp[r] - sdp[l - 1] + MOD) % MOD); } return 0; }