/* address:https://vjudge.net/problem/Yukicoder-1001 AC 2026/10/03 11:26 */ #include using namespace std; const int N = 3005; const int mod = 1e9 + 7; int n; int t[N], x[N]; int dp[N][N]; inline int Mod(int x) { return x >= mod ? x - mod : x; } inline void trans(int& x, int y) { x = x + y >= mod ? x + y - mod : x + y; } int cnt1[N], cnt2[N]; int sum1[N], sum2[N]; int C[N][N], fac[N]; int main() { scanf("%d", &n); C[0][0] = 1; fac[0] = 1; for (int i = 1;i <= n;++i) { fac[i] = fac[i - 1] * i % mod; C[i][0] = 1; for (int j = 1;j <= n;++j) C[i][j] = Mod(C[i - 1][j - 1] + C[i - 1][j]); } for (int i = 1;i <= n;++i) { scanf("%d%d", &t[i], &x[i]); if (t[i]) ++cnt2[x[i]]; else ++cnt1[x[i]]; } for (int i = 1;i <= n;++i) sum1[i] = sum1[i - 1] + cnt1[i], sum2[i] = sum2[i - 1] + cnt2[i]; dp[0][0] = 1; for (int i = 0;i < n;++i) for (int j = 0;j + sum1[i] <= i;++j) if (dp[i][j]) { const int k = sum2[i + 1] - (i - j - sum1[i]); if (k && j >= cnt1[i + 1]) trans(dp[i + 1][j - cnt1[i + 1]], 1ll * dp[i][j] * C[j][cnt1[i + 1]] % mod * fac[cnt1[i + 1]] % mod * k % mod); if (j + 1 >= cnt1[i + 1]) trans(dp[i + 1][j - cnt1[i + 1] + 1], 1ll * dp[i][j] * C[j + 1][cnt1[i + 1]] % mod * fac[cnt1[i + 1]] % mod); } printf("%d", dp[n][0]); return 0; }