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
#include <bits/stdc++.h>
using namespace std;
#ifdef DEBUG
auto&operator<<(auto &o, pair<auto, auto> p) {o << "(" << p.first << ", " << p.second << ")"; return o;}
auto operator<<(auto &o, auto x)->decltype(x.end(), o) {o<<"{"; for(auto e : x) o<<e<<", "; return o<<"}";}
#define debug(X) cerr << "["#X"]: " << X << '\n';
#else 
#define cerr if(0)cout
#define debug(X) ;
#endif
using ll = long long;
#define all(v) (v).begin(), (v).end()
#define ssize(x) int(x.size())
#define fi first
#define se second
#define mp make_pair
#define eb emplace_back

const int inf = 1e9, N = 80'000;
const int mod = 1'000'000'007;

bitset<N+5> reach[N+5];

void inc(int &a, int b) {
	a += b;
	if(a >= mod) a -= mod;
}

int mul(int a, int b) {
	return int(((ll)a*b)%mod);
}

int fpow(int a, int b) {
	if(b == 0) return 1;
	if(b%2 == 0) return fpow(mul(a, a), b/2);
	else return mul(a, fpow(a, b-1));
}

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

struct segtree {
	vector<int> tree;
	int base;
	segtree(int n) {
		base = 1;
		while (base < n) base *= 2;
		tree.resize(2*base, -inf);
	}

	void update(int l, int r, int x) {
		l += base-1; r += base+1;
		while(l/2 != r/2) {
			if(l%2 == 0) tree[l+1] = max(tree[l+1], x);
			if(r%2 == 1) tree[r-1] = max(tree[r-1], x);
			l /= 2; r /= 2;
		}
	}

	int query(int v) {
		v += base;
		int res = -inf;
		while (v)
			res = max(res, tree[v]), v /= 2;
		return res;
	}
};

int main() {
	ios_base::sync_with_stdio(false); cin.tie(nullptr);

	int n;
	cin >> n;
	vector<int> l(n), r(n);

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

	segtree t(2*n);
	
	vector<int> left(n), right(n);
	for(int i = 0; i < n; ++i) {
		left[i] = t.query(l[i]);
		right[i] = t.query(r[i]);
		if(left[i] == right[i]) right[i] = -inf;
		t.update(l[i], r[i], i);
	}
	
	vector<int> d(n);
	for(int i = n-1; i >= 0; --i) {
		reach[i][i] = 1;
		d[i] = reach[i].count();
		if(left[i] > -inf) reach[left[i]] |= reach[i];
		if(right[i] > -inf) reach[right[i]] |= reach[i];
	}

	int res = 0;
	for(int x : d) 
		inc(res, inv(x));

	cout << res << '\n';

	return 0;
}