#include #include #include #include #define llint long long #define inf 1e18 #define mod 1000000007 using namespace std; typedef pair P; llint n; llint t[3005], x[3005]; vector

vec; llint dp[3005][3005]; const int FACT_MAX = 200005; llint fact[FACT_MAX], fact_inv[FACT_MAX]; llint modpow(llint a, llint n) { if(n == 0) return 1; if(n % 2){ return ((a%mod) * (modpow(a, n-1)%mod)) % mod; } else{ return modpow((a*a)%mod, n/2) % mod; } } void make_fact() { llint val = 1; fact[0] = 1; for(int i = 1; i < FACT_MAX; i++){ val *= i; val %= mod; fact[i] = val; } fact_inv[FACT_MAX-1] = modpow(fact[FACT_MAX-1], mod-2); for(int i = FACT_MAX-2; i >= 0; i--){ fact_inv[i] = fact_inv[i+1] * (i+1) % mod; } } llint comb(llint n, llint k) { llint ret = 1; ret *= fact[n]; ret *= fact_inv[k], ret %= mod; ret *= fact_inv[n-k], ret %= mod; return ret; } int main(void) { ios::sync_with_stdio(0); cin.tie(0); make_fact(); cin >> n; for(int i = 1; i <= n; i++){ cin >> t[i] >> x[i]; vec.push_back(P(x[i], t[i])); if(t[i] == 1) vec.back().first--; } sort(vec.begin(), vec.end()); llint cnt = 0; dp[0][0] = 1; for(int i = 0; i < n; i++){ llint x = vec[i].first, t = vec[i].second; //cout << x << " " << t << endl; for(int j = 0; j <= n; j++){ if(t == 0){ if(x-(cnt+j) >= 0){ dp[i+1][j] += dp[i][j] * (x-(cnt+j)) % mod; dp[i+1][j] %= mod; } } else{ dp[i+1][j] += dp[i][j], dp[i+1][j] %= mod; if(j+1 <= n && x-(cnt+j) >= 0){ dp[i+1][j+1] += dp[i][j] * (x-(cnt+j)) % mod; dp[i+1][j+1] %= mod; } } } if(t == 0) cnt++; } /*for(int i = 0; i <= n; i++){ for(int j = 0; j <= n; j++){ cout << dp[i][j] << " "; } cout << endl; }*/ llint ans = 0; for(int i = 0; i <= n; i++){ llint tmp = dp[n][i]; tmp *= fact[n-(cnt+i)], tmp %= mod; if(i % 2) ans += mod - tmp, ans %= mod; else ans += tmp, ans %= mod; } cout << ans << endl; return 0; }