#include #include #define MOD 1000000007 using namespace std; struct point { int x,y; }; point a[100006]; struct coord { int c,index; }; coord xs[100006],ys[100006]; bool f(const coord &u, const coord &v ) { if ( u.c < v.c ) return true; if ( u.c == v.c && u.index < v.index ) return true; return false; } bool f_(const point &u, const point &v) { if ( u.x < v.x ) return true; if ( u.x == v.x && u.y < v.y ) return true; return false; } int n,tree[2][100006]; void update(int flag,int i) { while ( i <= n ) { tree[flag][i]++; i += i&(-i); } } int query(int flag,int i) { int ans=0; while (i) { ans += tree[flag][i]; i -= i&(-i); } return ans; } int before[100006]; int main() { freopen ( "countm.in", "r", stdin ); freopen ( "countm.out", "w", stdout ); int i,ans=0,after,toAdd; scanf ("%d",&n); for ( i=1; i<=n; i++ ) { scanf ("%d%d",&a[i].x,&a[i].y); xs[i].c = a[i].x; xs[i].index = i; ys[i].c = a[i].y; xs[i].index = i; } sort (xs+1,xs+n+1,f); sort (ys+1,ys+n+1,f); for ( i=1; i<=n; i++ ) a[ xs[i].index ].x = i; for ( i=1; i<=n; i++ ) a[ ys[i].index ].y = i; sort (a+1,a+n+1,f_); for ( i=1; i<=n; i++ ) { before[i] = ( (long long)query(0,a[i].y)*(long long)query(1,n-a[i].y+1) )%MOD; update (0,a[i].y); update (1,n-a[i].y+1); } for ( i=1; i<=n; i++ ) tree[0][i] = tree[1][i] = 0; for ( i=n; i>=1; i-- ) { after = ( (long long)query(0,a[i].y)*(long long)query(1,n-a[i].y+1) )%MOD; toAdd = ( (long long)after*(long long)before[i] )%MOD; ans = (ans+toAdd)%MOD; update(0,a[i].y); update(1,n-a[i].y+1); } printf ("%d\n",ans); }