#include using namespace std; const int MaxN = (int)4e6 + 10; const int INF = (int)1e9; const int MOD = (int)1e9 + 7; int fc[MaxN], rf[MaxN], inv[MaxN]; int kdp[3018]; int calcZ(int lx, int ly, int rx, int ry) { if (lx > rx || ly > ry) { return 0; } return 1LL * fc[(rx - lx) + (ry - ly)] * rf[rx - lx] % MOD * rf[ry - ly] % MOD; } int calc(int lx, int ly, int rx, int ry, int c) { int kx = ly + c - 1, ky = lx - c + 1; return (calcZ(lx, ly, rx, ry) - calcZ(kx, ky, rx, ry) + MOD) % MOD; } int main() { // freopen("input.txt", "r", stdin); fc[0] = rf[0] = 1; for (int i = 1; i < MaxN; ++i) { inv[i] = i == 1 ? 1 : 1LL * (MOD - MOD / i) * inv[MOD % i] % MOD; fc[i] = 1LL * i * fc[i - 1] % MOD; rf[i] = 1LL * inv[i] * rf[i - 1] % MOD; } int m, q, p, c; scanf("%d%d%d%d", &p, &q, &c, &m); assert (1 <= m && m <= 3000); assert (0 <= q && q <= 2000000); assert (0 <= p && p <= 2000000); assert (0 <= c && c <= 2000000); set < pair < int, int > > s; int mi = INF; for (int i = 1; i <= m; ++i) { int x, y; scanf("%d%d", &x, &y); if (y == 0) { mi = min(mi, x); } assert (0 <= x && x <= 2000000); assert (0 <= y && y <= 2000000); if (x - y >= c && x <= p && y <= q) { s.insert(make_pair(x, y)); } } if (p == 0 && q < mi) { printf("1\n"); return 0; } if (mi <= c || s.count(make_pair(p, q)) || p - q < c) { printf("0\n"); return 0; } vector < pair < int, int > > pts = vector < pair < int, int > > (s.begin(), s.end()); pts.push_back(make_pair(p, q)); for (int i = 0; i < (int)pts.size(); ++i) { kdp[i] = calc(c, 0, pts[i].first, pts[i].second, c); for (int j = 0; j < i; ++j) { if (pts[i].first >= pts[j].first && pts[i].second >= pts[j].second) { kdp[i] -= 1LL * kdp[j] * calc(pts[j].first, pts[j].second, pts[i].first, pts[i].second, c) % MOD; if (kdp[i] < 0) { kdp[i] += MOD; } } } } printf("%d\n", kdp[(int)pts.size() - 1]); return 0; }