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
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 5e5 + 7, Z = 1024 * 1024;
long long mod = 1000000007;

int lsyn[N], rsyn[N];
int przedz[2 * Z + 7];
int ilu[N];
int odw[N];
int czas;


void ustaw(int l, int r, int val) {
    l += Z - 1;
    r += Z + 1;
    while (l + 1 < r) {
        if (l % 2 == 0) {
            przedz[l + 1] = val;
        }
        if (r % 2 == 1) {
            przedz[r - 1] = val;
        }
        l /= 2;
        r /= 2;
    }
}

int getmax(int x) {
    x += Z;
    int ret = 0;
    while (x / 2 != 0) {
        x /= 2;
        ret = max(ret, przedz[x]);
    }
    return ret;
}


void dfs(int v) {
    ilu[v]++;
    odw[v] = czas;
    if (lsyn[v] != 0 && odw[lsyn[v]] < czas)
        dfs(lsyn[v]);
    if (rsyn[v] != 0 && odw[rsyn[v]] < czas)
        dfs(rsyn[v]);
}

long long binpow(long long a, long long n) {
    long long ret = 1;
    while (n) {
        if (n % 2)
            ret = (ret * a) % mod;
        a = (a * a) % mod;
        n /= 2;
    }
    return ret;
}


int main() {
    int n, a, b;
    cin >> n;
    for (int h = 1; h <= n; h++) {
        cin >> a >> b;
        lsyn[h] = getmax(a);
        rsyn[h] = getmax(b);
        ustaw(a, b, h);
    }

    for (int h = 1; h <= n; h++) {
        czas++;
        dfs(h);
    }

    long long wyn = 0;

    for (int h = 1; h <= n; h++) {
        wyn += binpow(ilu[h], mod - 2);
    }
    wyn %= mod;
    cout << wyn;
    return 0;
}