#include <bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n) for (int i=n-1;i>=a;i--)
#define pb push_back
#define eb emplace_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef vector<int> VI;
typedef basic_string<int> BI;
typedef long long ll;
typedef pair<int,int> PII;
typedef double db;
mt19937 mrand(1); 
const ll mod=1000000007;
int rnd(int x) { return mrand() % x;}
ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;}
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
// head
// note : [l ,r] means a[l+1 ... r] here
struct segcover {
	map<PII,int> sg;
	int L_,R_;
	void init(int L,int R) {
		sg[{L-1,L-1}]=-1;
		sg[{R+1,R+1}]=-1;
		L_=L-1; R_=R+1;
	}
	int query(int x) {
		auto pl=--sg.lower_bound({x,L_});
		return pl->se;
	}
	void add(int l,int r,int id,function<void(int,int,int)>delseg=[](int l,int r,int id) {},
		function<void(int,int,int)> addseg=[](int l,int r,int id) {}) {
		auto split=[&](int p) {
			auto pl=--sg.lower_bound({p,L_});
			if (pl->fi.se>p) {
				int l=pl->fi.fi,r=pl->fi.se,id=pl->se;
				sg.erase(pl);
				sg[{l,p}]=id;
				sg[{p,r}]=id;
			}
		};
		split(l); split(r);
		auto pl=sg.lower_bound({l,L_});
		while (1) {
			auto pr=pl; ++pr;
			if (pl->fi.fi>=r) break;
			delseg(pl->fi.fi,pl->fi.se,pl->se);
			sg.erase(pl);
			pl=pr;
		}
		addseg(l,r,id);
		sg[{l,r}]=id;
	}
}oo;
const int N=501000;
int n,a[N],b[N],L[N],R[N],dp[N],cc[N],st;
ll ret=0;
int main() {
	scanf("%d",&n);
	oo.init(-2,2*n+2);
	oo.add(-1,2*n+1,0);
	rep(i,1,n+1) {
		scanf("%d%d",&a[i],&b[i]);
		L[i]=oo.query(a[i]);
		R[i]=oo.query(b[i]);
		oo.add(a[i],b[i],i);
	}
	per(i,1,n+1) {
		cc[i]++;
		int u=L[i],v=R[i];
		cc[L[i]]+=cc[i]; cc[R[i]]+=cc[i];
		while (u!=v) {
			if (u>v) u=R[u]; else v=L[v];
			st++;
		}
		cc[u]-=cc[i];
		ret+=powmod(cc[i],mod-2);
		//printf("%d %d\n",i,cc[i]);
	}
	printf("%lld\n",ret%mod);
	//fprintf(stderr,"%d\n",st);
}
        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  | #include <bits/stdc++.h> using namespace std; #define rep(i,a,n) for (int i=a;i<n;i++) #define per(i,a,n) for (int i=n-1;i>=a;i--) #define pb push_back #define eb emplace_back #define mp make_pair #define all(x) (x).begin(),(x).end() #define fi first #define se second #define SZ(x) ((int)(x).size()) typedef vector<int> VI; typedef basic_string<int> BI; typedef long long ll; typedef pair<int,int> PII; typedef double db; mt19937 mrand(1); const ll mod=1000000007; int rnd(int x) { return mrand() % x;} ll powmod(ll a,ll b) {ll res=1;a%=mod; assert(b>=0); for(;b;b>>=1){if(b&1)res=res*a%mod;a=a*a%mod;}return res;} ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;} // head // note : [l ,r] means a[l+1 ... r] here struct segcover { map<PII,int> sg; int L_,R_; void init(int L,int R) { sg[{L-1,L-1}]=-1; sg[{R+1,R+1}]=-1; L_=L-1; R_=R+1; } int query(int x) { auto pl=--sg.lower_bound({x,L_}); return pl->se; } void add(int l,int r,int id,function<void(int,int,int)>delseg=[](int l,int r,int id) {}, function<void(int,int,int)> addseg=[](int l,int r,int id) {}) { auto split=[&](int p) { auto pl=--sg.lower_bound({p,L_}); if (pl->fi.se>p) { int l=pl->fi.fi,r=pl->fi.se,id=pl->se; sg.erase(pl); sg[{l,p}]=id; sg[{p,r}]=id; } }; split(l); split(r); auto pl=sg.lower_bound({l,L_}); while (1) { auto pr=pl; ++pr; if (pl->fi.fi>=r) break; delseg(pl->fi.fi,pl->fi.se,pl->se); sg.erase(pl); pl=pr; } addseg(l,r,id); sg[{l,r}]=id; } }oo; const int N=501000; int n,a[N],b[N],L[N],R[N],dp[N],cc[N],st; ll ret=0; int main() { scanf("%d",&n); oo.init(-2,2*n+2); oo.add(-1,2*n+1,0); rep(i,1,n+1) { scanf("%d%d",&a[i],&b[i]); L[i]=oo.query(a[i]); R[i]=oo.query(b[i]); oo.add(a[i],b[i],i); } per(i,1,n+1) { cc[i]++; int u=L[i],v=R[i]; cc[L[i]]+=cc[i]; cc[R[i]]+=cc[i]; while (u!=v) { if (u>v) u=R[u]; else v=L[v]; st++; } cc[u]-=cc[i]; ret+=powmod(cc[i],mod-2); //printf("%d %d\n",i,cc[i]); } printf("%lld\n",ret%mod); //fprintf(stderr,"%d\n",st); }  | 
            
        
                    English