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
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define all(x) (x).begin(), (x).end()
#define mid ((l+r)/2)
#define siz(x) (int)(x).size()
#define BOOST ios_base::sync_with_stdio(0), cin.tie(0)
#define deb(x) cout << #x << ": " << x << "\n"
typedef long long ll;
typedef long double ld;
typedef pair<int, int> ii;

const int N = 7e4 + 5, mod = 1e9 + 7;

// struct modus{
// 	int value;
// 	modus(int value = 0) : value(value) {};
// 	modus operator+(const modus &x) const {
// 		return (value + x.value)%mod;
// 	}
// 	modus operator*(const modus &x) const {
// 		return ((ll)value * x.value)%mod;
// 	}
// 	modus operator-(const modus &x) const {
// 		return ((value - x.value) + mod)%mod;
// 	}
// };

ii t[N];
bitset<N> bit[N];
int p[N];
// modus p[N];
set<ii> s;
int n;

int mpow(int x, int p){
	if(p == 0) return 1;
	if(p&1) return (ll)mpow(x, p-1)*x %mod;
	int res = mpow(x, p>>1);
	return (ll)res*res %mod;
}
// modus mpow(modus x, int p){
// 	if(p == 0) return 1;
// 	if(p&1) return mpow(x, p-1)*x;
// 	modus res = mpow(x, p>>1);
// 	return res*res;
// }

int inv(int x){
	return mpow(x, mod-2);
}

int go(int x){
	return (ll)p[n]*inv(x+1) %mod;
}

int main(){
	BOOST;
	p[0] = 1;
	for(int i=1; i<N; i++){
		p[i] = (ll)p[i-1]*i %mod;
	}

	cin >> n;
	for(int i=0; i<n; i++){
		int l, r; cin >> l >> r;
		t[i] = {l, r};
	}
	reverse(t, t+n);

	int ans = 0;
	for(int i=0; i<n; i++){
		while(1){
			auto x = s.lower_bound({t[i].fi, 0});
			if(x == s.end()) break;
			if((*x).fi > t[i].se) break;
			// printf("koniec %d jest nad {%d, %d}\n", (*x).fi, t[i].fi, t[i].se);
			bit[i] |= bit[(*x).se];
			bit[i][(*x).se] = 1;
			s.erase(x);
		}
		ans = (ans + go(bit[i].count())) %mod;
		// printf("bit[i].count() = %ld\n", bit[i].count());
		// printf("i = %d, ans = %d\n", i, ans.value);
		s.insert({t[i].fi, i});
		s.insert({t[i].se, i});
	}
	// printf("ans = %d\n", ans.value);
	ans = (ll)ans*inv(p[n]) %mod;
	cout << ans << "\n";
}