#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef unsigned long long ULL;
const LL MOD = 1e9 + 7;
const int M = 1 << 21;
pair<int, int> T[M * 2 + 5];
void update(int a, int b, LL v, int hist) {
	a += M;
	b += M;
	T[a] = {v, hist};
	T[b] = {v, hist};
	while (a / 2 != b / 2) {
		if ((a & 1) == 0) {
			T[a + 1] = {v, hist};
		}
		if ((b & 1) == 1) {
			T[b - 1] = {v, hist};
		}
		a /= 2;
		b /= 2;
	}
}
int query(int a) {
	a += M;
	auto res = T[a];
	while (a != 1) {
		if (T[a].second > res.second) {
			res = T[a];
		}
		a /= 2;
	}
	return res.first;
}
LL gcd(LL a, LL b, LL& x, LL& y) {
	x = 1, y = 0;
	LL x1 = 0, y1 = 1, a1 = a, b1 = b;
	while (b1) {
		LL q = a1 / b1;
		tie(x, x1) = make_tuple(x1, x - q * x1);
		tie(y, y1) = make_tuple(y1, y - q * y1);
		tie(a1, b1) = make_tuple(b1, a1 - q * b1);
	}
	return a1;
}
pair<int, int> v[500009];
pair<int, int> hist[500009];
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	int n;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int a, b;
		cin >> a >> b;
		hist[i] = {a, b};
		int A = query(a);
		int B = query(b);
		if (A != 0) {
			v[i].first = A;
		}
		if (A != B && B != 0) {
			v[i].second = B;
		}
		update(a, b, i, i);
	}
	vector<vector<ULL>> V(n + 1);
	for (int i = 0; i < n; i++) {
		V[i].resize(i / 64 + 1);
	}
	LL q = 1;
	for (LL i = 2; i <= n; i++) {
		q = (q * i) % MOD;
	}
	LL qq, tmp;
	gcd(q, MOD, qq, tmp);
	qq = (qq + MOD) % MOD;
	LL res = 0;
	for (int i = n; i > 0; i--) {
		const int id = n - i;
		const int idx = id / 64;
		const int idxm = id % 64;
		int x = 0;
		for (int l = 0; l <= idx; ++l) {
			x += popcount(V[id][l]);
		}
		x++;
		LL X;
		gcd(x, MOD, X, tmp);
		X = (X + MOD) % MOD;
		res = (res + q * X) % MOD;
		if (v[i].first != 0) {
			const int jd = n - v[i].first;
			V[jd][idx] |= 1LL << idxm;
			for (int l = 0; l <= idx; ++l) {
				V[jd][l] |= V[id][l];
			}
		}
		if (v[i].second != 0) {
			const int jd = n - v[i].second;
			V[jd][idx] |= 1LL << idxm;
			for (int l = 0; l <= idx; ++l) {
				V[jd][l] |= V[id][l];
			}
		}
	}
	cout << (res * qq + MOD) % MOD << "\n";
	return 0;
}
        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 111 112 113 114 115 116 117 118 119 120 121 122  | #include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; const LL MOD = 1e9 + 7; const int M = 1 << 21; pair<int, int> T[M * 2 + 5]; void update(int a, int b, LL v, int hist) { a += M; b += M; T[a] = {v, hist}; T[b] = {v, hist}; while (a / 2 != b / 2) { if ((a & 1) == 0) { T[a + 1] = {v, hist}; } if ((b & 1) == 1) { T[b - 1] = {v, hist}; } a /= 2; b /= 2; } } int query(int a) { a += M; auto res = T[a]; while (a != 1) { if (T[a].second > res.second) { res = T[a]; } a /= 2; } return res.first; } LL gcd(LL a, LL b, LL& x, LL& y) { x = 1, y = 0; LL x1 = 0, y1 = 1, a1 = a, b1 = b; while (b1) { LL q = a1 / b1; tie(x, x1) = make_tuple(x1, x - q * x1); tie(y, y1) = make_tuple(y1, y - q * y1); tie(a1, b1) = make_tuple(b1, a1 - q * b1); } return a1; } pair<int, int> v[500009]; pair<int, int> hist[500009]; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; for (int i = 1; i <= n; i++) { int a, b; cin >> a >> b; hist[i] = {a, b}; int A = query(a); int B = query(b); if (A != 0) { v[i].first = A; } if (A != B && B != 0) { v[i].second = B; } update(a, b, i, i); } vector<vector<ULL>> V(n + 1); for (int i = 0; i < n; i++) { V[i].resize(i / 64 + 1); } LL q = 1; for (LL i = 2; i <= n; i++) { q = (q * i) % MOD; } LL qq, tmp; gcd(q, MOD, qq, tmp); qq = (qq + MOD) % MOD; LL res = 0; for (int i = n; i > 0; i--) { const int id = n - i; const int idx = id / 64; const int idxm = id % 64; int x = 0; for (int l = 0; l <= idx; ++l) { x += popcount(V[id][l]); } x++; LL X; gcd(x, MOD, X, tmp); X = (X + MOD) % MOD; res = (res + q * X) % MOD; if (v[i].first != 0) { const int jd = n - v[i].first; V[jd][idx] |= 1LL << idxm; for (int l = 0; l <= idx; ++l) { V[jd][l] |= V[id][l]; } } if (v[i].second != 0) { const int jd = n - v[i].second; V[jd][idx] |= 1LL << idxm; for (int l = 0; l <= idx; ++l) { V[jd][l] |= V[id][l]; } } } cout << (res * qq + MOD) % MOD << "\n"; return 0; }  | 
            
        
                    English