Language: C++

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#define ordered_set tree<ll, null_type,less<ll>, rb_tree_tag,tree_order_statistics_node_update>   
using namespace std;
using namespace __gnu_pbds;
typedef long long ll; 
#define int long long
typedef unsigned long long lu;
typedef vector<ll> v;
typedef vector<vector<ll> > vv;
typedef vector<string>  vs;
typedef vector<pair<ll,ll>> vpr;
typedef long double ld;
#define f(i,n) for(ll i = 0; i < n; i++)
#define ff(i,n) for(ll i=1;i<=n;i++)
#define pb push_back
#define mp make_pair
#define endl "\n"
#define fi first
#define se second
#define all(x) x.begin(),x.end()
#define rall(x) x.rbegin(),x.rend()
#define amax(x,y) if(y>x) x=y;
#define amin(x,y) if(y<x)x=y;
#define bg(x) x.begin()
#define sz(x) (ll)x.size()
#define in(x,n) for(ll i=0;i<n;i++)cin>>x[i]
#define out(x,n) for(ll i=0;i<n;i++)cout<<x[i]<<" " 
#define mxt(a) *(max_element(a.begin(),a.end()))
#define mnt(a) *(min_element(a.begin(),a.end())
#define tc ll t;cin>>t;while(t--)
typedef pair<ll,ll> pi;
#define yes cout<<"YES\n";
#define no cout<<"NO\n";
#define yesno(f) if(f) yes else no
const v dx = {1, -1, 0, 0};
const v dy = {0, 0, 1, -1};
const ll mod=1e9+7;
const ld PI = 2 * acos(0.0);
ll m(ll a){ return (a+mod)%mod;}
ll cel(ll x1,ll y1){if((x1%y1)==0)return x1/y1;else return x1/y1+1;}
ll power(ll a,ll b,ll m)
{
	if(b==0)
		return 1;
	ll d=power(a,b/2,m);
	d=(d*d);
	if(d > m)d%=m;
	if(b&1)
		d=(d*a);
	if(d > m)d%=m;
	return d;
}
// set_name.find_by_order(k) It returns to an iterator to the kth element (counting from zero) in the set in O(logn) time
// set_name.order_of_key(k) It returns to the number of items that are strictly smaller than our item k in O(logn) time.
/*string operations :
str.substr (x,y) : returns a substring str[x],str[x+1],...str[x+y-1]
str.substr (x) : returns a substring str[x],... end of string
str.find(qtr) : returns the first occurenece of qtr in str */
int solve(){}
v arr;
void dfs(int u,vector<bool>&vst,vv &gr)
{
	for(auto it:gr[u])
	{
		if(!vst[it])
		{
			vst[it]=true;
			dfs(it,vst,gr);
		}
	}
	arr.pb(u);
}
int fact[300002];
int ways(pi a,pi b)
{
	int x=b.fi-a.fi;
	int y=b.se-a.se;
	int val;
	if(x<0 || y<0)val= 0;
	else
	{
		int denom=fact[x]*fact[y];
		if(denom > mod)denom%=mod;
		val=fact[x+y]*power(denom,mod-2,mod);
		if(val > mod)val%=mod;
		// val=(fact[x+y]*power((fact[x]*fact[y])%mod,mod-2,mod))%mod;
	}
	return val;	
}
int32_t main()
{
	ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);
    int h,w;cin>>h>>w;
    int m;cin>>m;
    fact[0]=1;
    for(int i=1;i<=300000;i++)
    {
    	fact[i]=(fact[i-1]*i)%mod;
    }
    vpr hurdles(m+1);
    f(i,m)
    {
    	int x,y;cin>>x>>y;
    	hurdles[i]=mp(x,y);
    }
    hurdles[m]=mp(h,w);
    m++;
    vv gr(m);
    for(int i=0;i<m;i++)
    {
    	for(int j=0;j<m;j++)
    	{
    		if(i!=j)
    		{
    			if((hurdles[i].fi <= hurdles[j].fi) && (hurdles[i].se <=hurdles[j].se))
    			{
    				gr[i].pb(j);
    			}
    		}
    	}
    }
    vector<bool>vst(m,false);
    for(int i=0;i<m;i++)
    {
    	if(!vst[i])
    	{
    		vst[i]=true;
    		dfs(i,vst,gr);
    	}
    }
    reverse(all(arr));
    v dp(m,0);
    dp[0]=ways({1,1},hurdles[arr[0]]);
    for(int i=1;i<m;i++)
    {
    	dp[i]=ways({1,1},hurdles[arr[i]]);
    	for(int j=0;j<i;j++)
    	{
    		int ans=(dp[j]*ways(hurdles[arr[j]],hurdles[arr[i]]));
    		if(ans > mod)
    			ans%-=mod;
    		dp[i]-=ans;
    		if(dp[i] < 0)
    			dp[i]+=mod;
    		if(dp[i] > mod)
    			dp[i]-=mod;
    		// dp[i]=(dp[i]+mod)%mod;
    	}
    	dp[i]%=mod;
    }
    cout<<dp[m-1]<<endl;

    return 0;
}

Compiler output:
a.cc: In function 'long long int solve()':
a.cc:61:13: warning: no return statement in function returning non-void [-Wreturn-type]
   61 | int solve(){}
      |             ^
a.cc: In function 'int32_t main()':
a.cc:143:29: error: expected primary-expression before '-=' token
  143 |                         ans%-=mod;
      |                             ^~