#include #include #include #include #include #include #ifdef _WIN32 #define getchar _getchar_nolock #define putchar _putchar_nolock #else #define getchar getchar_unlocked #define putchar putchar_unlocked #endif #define pll pair #define pld pair typedef long long ll; typedef long double ld; typedef __int128 i128; namespace io { using namespace std; template void debug (T x) { cerr< void debuglen (T x) { cerr< void debug (T x,Args...args) { debuglen(x); debug(args...); } template void debug (T *lt,T *rt) { ll len=rt-lt; for (ll i=0;i'9') { if (x=='-') { f=-1; } x=getchar(); } while (x>='0'&&x<='9') { ans=(ans<<1)+(ans<<3); ans+=(x^'0'); x=getchar(); } return ans*f; } template void write (T x) { if (x<0) { putchar('-'); x=-x; } if (x>=10) { write(x/10); } putchar(x%10+'0'); } template inline void print (T x) { write(x); putchar('\n'); } template inline void printlen (T x) { write(x); putchar(' '); } template inline void print (T x,Args...args) { printlen(x); print(args...); } template inline void print (T *lt,T *rt) { ll len=rt-lt; for (ll i=0;i v[2]; inline void solve () { n=read(); for (ll i=1;i<=n;i++) { ll op=read(),x=read(); v[op].push_back(x); cnt[op][x]++; } for (ll i=1;i<=n;i++) { cnt[1][i]+=cnt[1][i-1]; } for (ll i=n;i;i--) { cnt[0][i]+=cnt[0][i+1]; } sort(v[0].begin(),v[0].end()); sort(v[1].begin(),v[1].end()); f[0][0]=1; for (ll i=0;i0) { f[i+1][j+1]+=f[i][j]*val%mod; if (f[i+1][j+1]>=mod) { f[i+1][j+1]-=mod; } } val=cnt1-(i-j); if (val>0) { f[i+1][j]+=f[i][j]*val%mod; if (f[i+1][j]>=mod) { f[i+1][j]-=mod; } } } } print(f[n][v[0].size()]); } int main () { // freopen(".in","r",stdin); // freopen(".out","w",stdout); ll T=1; while (T--) { solve(); } return 0; }