1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
#include<bits/stdc++.h>

using namespace std;

const int maxn=500009;
const long long MOD=1000'000'007;
vector<long long> D[maxn];
set<long long> S;
pair<long long, long long> polki[maxn];
long long ziomek[maxn*2];
bool odw[maxn];
long long silnia[maxn];

void DFS(long long v) {
	odw[v]=1;
	for(auto s:D[v]) {
		if(!odw[s]) {
			DFS(s);
		}
	}
}	

void wypelnij_silnie(long long n) {
	long long ile=1;
	silnia[0]=1;
	for(long long i=1; i<=n; i++) {
		ile*=i;
		ile%=MOD;
		silnia[i]=ile;
	}	
}	

long long pot(long long a, long long b) {
    long long wyn=1;
    while(b) {
        if(b%2==1) {
            wyn*=a;
            wyn%=MOD;
        }
        a*=a;
        a%=MOD;
        b/=2;
    }
    return wyn;
}

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	long long n, a, b;
	cin >> n;
	for(long long i=1; i<=n; i++) {
		cin >> a >> b;
		polki[i]={a, b};
		ziomek[a]=i;
		ziomek[b]=i;
	}	
	wypelnij_silnie(n+1);
	S.insert(-10000000);
	S.insert(10000000);
	for(long long i=n; i>=1; i--) {
		while(*S.upper_bound(polki[i].first)<polki[i].second) {
			a=*S.upper_bound(polki[i].first);
			D[i].push_back(ziomek[a]);
			S.erase(a);
		}	
		S.insert(polki[i].first);
		S.insert(polki[i].second);
	}	
	long long ile, wszystkie, mianownik, wyn=0, wynteraz;
	for(long long i=1; i<=n; i++) {
		DFS(i);
		ile=0;
		for(long long j=1; j<=n; j++) {
			if(odw[j]) {
				ile++;
			}
			odw[j]=0;
		}	
		ile--;
		if(ile==0) {
			wyn++;
			wyn%=MOD;
			continue;
		}	
		wszystkie=n-1;
		//cout << i << ' ' << ile << endl;
		// wszystkie+1 nad ile+1
		wynteraz=silnia[wszystkie+1];
		mianownik=(silnia[ile+1]*silnia[wszystkie-ile])%MOD;
		//cout << mianownik << endl;
		mianownik=pot(mianownik, MOD-2);
		wynteraz*=mianownik;
		wynteraz%=MOD;
		wynteraz*=silnia[ile];
		wynteraz%=MOD;
		wynteraz*=silnia[wszystkie-ile];
		wynteraz%=MOD;
		//wynteraz/=n!
		mianownik=silnia[n];
		mianownik=pot(mianownik, MOD-2);
		wynteraz*=mianownik;
		wynteraz%=MOD;
		
		wyn+=wynteraz;
		wyn%=MOD;
	}	
	cout << wyn;
}