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
#include <bits/stdc++.h>
using namespace std;
const int MX=500050,md=1000000007;
int n,w[MX],cnt[MX];
pair<int,int> a[MX];
vector<unsigned int> b[MX];
set<int> g[MX];
long long P,Q=1;
long long pw(long long x, int y) {
  if (y==0) return 1LL;
  if (y&1) return (pw(x,y-1)*x)%md;
  long long z=pw(x,y/2);
  return (z*z)%md;
}
void updres(long long q) {
  P=(P*q+Q)%md;
  Q=(Q*q)%md;
}
void add(int i, int j) {
  b[i][j/32]|=(1U<<(j&31));
}
int main() {
  scanf("%d",&n);
  for (int i=0; i<n; i++) scanf("%d%d",&a[i].first,&a[i].second);
  reverse(a,a+n);
  for (int i=0; i<n; i++) {
    w[a[i].first]=i;
    w[a[i].second]=i;
  }
  set<int> all;
  for (int i=0; i<n; i++) {
    auto it=all.upper_bound(a[i].first);
    while (it!=all.end() && *it<a[i].second) {
      g[i].insert(-w[*it]);
      all.erase(it);
      it=all.upper_bound(a[i].first);
    }
    for (int j: g[i]) ++cnt[-j];
    all.insert(a[i].first);
    all.insert(a[i].second);
  }
  int len=(n-1)/32+1;
  for (int i=0; i<n; i++) {
    for (int j: g[i]) if (cnt[-j]==1) {
      --cnt[-j];
      swap(b[i],b[-j]);
      break;
    }
    int len=i/32+1;
    b[i].resize(len);
    for (int j: g[i]) if (cnt[-j]) {
      int plen=(-j)/32;
      for (int k=0; k<=plen; k++) b[i][k]|=b[-j][k];
      if (--cnt[-j]==0) b[-j].clear();
    }
    int prv=1;
    for (int k=0; k<len; k++) prv+=__builtin_popcount(b[i][k]);
    updres(prv);
    if (cnt[i]==0) b[i].clear(); else add(i,i);
  }
  printf("%lld\n",(P*pw(Q,md-2))%md);
  return 0;
}