func_code_string: #include <bits/stdc++.h>   #pragma GCC optimize( O3 )   using namespace std;   const int maxn = 1e6 + 10;   const int md = 1e9 + 7;   long long FAC[maxn], iFAC[maxn];   long long dp[maxn];   vector<tuple<int, int>> a;   long long mpow(long long a, long long b) {     if (b == 0) return 1;     long long res = mpow(a, b / 2);     res *= res;     res %= md;     if (b & 1ll) {       res *= a;       res %= md;     }     return res;   }   long long inv(long long a) { return mpow(a, md - 2); }   void pre_calc() {     FAC[0] = FAC[1] = 1;     for (int i = 2; i <= 200000; i++) FAC[i] = (FAC[i - 1] * i) % md;     iFAC[0] = iFAC[1] = 1;     for (int i = 2; i <= 200000; i++) iFAC[i] = (iFAC[i - 1] * inv(i)) % md;   }   int T;   string str;   int x, y, n, m;   int nk;   void task() {     cin >> n >> m >> nk;     for (int i = 0; i < nk; ++i) {       cin >> x >> y;       --x;       --y;       a.emplace_back(x, y);     }     --n;     --m;     a.emplace_back(n, m);     sort(a.begin(), a.end());     for (int i = 0; i < a.size(); ++i) {       int xi = get<0>(a[i]), yi = get<1>(a[i]);       dp[i] = FAC[xi + yi] * iFAC[xi] % md * iFAC[yi] % md;       for (int j = 0; j < i; ++j) {         int xj = get<0>(a[j]), yj = get<1>(a[j]);         long long mul =             FAC[xi + yi - xj - yj] * iFAC[xi - xj] % md * iFAC[yi - yj] % md;         dp[i] = (dp[i] - dp[j] * mul % md) % md;       }     }     cout << (dp[a.size() - 1] + md) % md << endl;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(NULL);     pre_calc();     T = 1;     while (T--) {       task();     }     return 0;   }   