#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <cstring>
#include <cmath>
#include <ctime>
#include <algorithm>
#include <vector>
#include <set>
#include <queue>
#include <map>
#include <bitset>
#define ls (x<<1)
#define rs (x<<1|1)
using namespace std;
typedef long long ll;
ll geti(){
    ll ret=0;char ch=getchar(),k=1;
    while((ch<'0' || ch>'9') && ch!='-')ch=getchar();
    if(ch=='-')k=0,ch=getchar();
    while(ch>='0' && ch<='9')ret=ret*10+ch-'0',ch=getchar();
    return k?ret:-ret;
}
const int maxn = 200000 + 52;
const int mo = 1e9 + 7;
int n;
struct node{
    int x,v,hx;
}a[maxn];
struct segment{
    int l,r;
}seg[maxn];
bool cmpx(const node &x,const node &y){
    return x.x<y.x;
}
bool cmpv(const node &x,const node &y){
    return x.v<y.v;
}
bool cmps(const segment &x,const segment &y){
    return x.r==y.r?x.l<y.l:x.r<y.r;
}
int mn[maxn*4],mx[maxn*4];
void qminmodify(int x,int l,int r,int p,int v){
    if(l==r){
        mn[x]=min(mn[x],v); return;
    }
    int mid=(l+r)>>1;
    if(p<=mid) qminmodify(ls,l,mid,p,v);
    else qminmodify(rs,mid+1,r,p,v);
    mn[x]=min(mn[ls],mn[rs]);
}
void qmaxmodify(int x,int l,int r,int p,int v){
    if(l==r){
        mx[x]=max(mx[x],v); return;
    }
    int mid=(l+r)>>1;
    if(p<=mid) qmaxmodify(ls,l,mid,p,v);
    else qmaxmodify(rs,mid+1,r,p,v);
    mx[x]=max(mx[ls],mx[rs]);
}
int qmin(int x,int l,int r,int xl,int xr){
    if(l==xl && r==xr){
        return mn[x];
    }
    int mid=(l+r)>>1;
    if(xr<=mid) return qmin(ls,l,mid,xl,xr);
    else if(xl>mid) return qmin(rs,mid+1,r,xl,xr);
    return min(qmin(ls,l,mid,xl,mid),qmin(rs,mid+1,r,mid+1,xr));
}
int qmax(int x,int l,int r,int xl,int xr){
    if(l==xl && r==xr){
        return mx[x];
    }
    int mid=(l+r)>>1;
    if(xr<=mid) return qmax(ls,l,mid,xl,xr);
    else if(xl>mid) return qmax(rs,mid+1,r,xl,xr);
    return max(qmax(ls,l,mid,xl,mid),qmax(rs,mid+1,r,mid+1,xr));
}
int T[maxn*4];
void modify(int x,int l,int r,int p,int v){
    if(l==r){
        (T[x]+=v)%=mo; return;
    }
    int mid=(l+r)>>1;
    if(p<=mid) modify(ls,l,mid,p,v);
    else modify(rs,mid+1,r,p,v);
    T[x]=(T[ls]+T[rs])%mo;
}
int query(int x,int l,int r,int xl,int xr){
    if(l==xl && r==xr){
        return T[x];
    }
    int mid=(l+r)>>1;
    if(xr<=mid) return query(ls,l,mid,xl,xr);
    else if(xl>mid) return query(rs,mid+1,r,xl,xr);
    return (query(ls,l,mid,xl,mid)+query(rs,mid+1,r,mid+1,xr))%mo;
}
int main(){
    n=geti();
    for(int i=1;i<=n;i+=1){
        a[i].x=geti(); a[i].v=geti();
    }
    sort(a+1,a+1+n,cmpx);
    int s=2;
    for(int i=1;i<=n;i+=1){
        if(i==1 || a[i].x!=a[i-1].x) ++s;
        a[i].hx=s;
    }
    sort(a+1,a+1+n,cmpv);
    /*for(int i=1;i<=n;i+=1){
        printf("%d %d\n",a[i].hx,a[i].v);
    }
    */
    memset(mn,127,sizeof(mn));
    for(int i=1;i<=n;i+=1){
        qminmodify(1,1,n+10,a[i].hx,i);
        seg[i].l=qmin(1,1,n+10,a[i].hx+1,s+1);
    }
    for(int i=n;i>=1;i-=1){
        qmaxmodify(1,1,n+10,a[i].hx,i);
        seg[i].r=qmax(1,1,n+10,1,a[i].hx-1);
    }
    for(int i=1;i<=n;i+=1){
        if(seg[i].l==2139062143) seg[i].l=i;
        if(seg[i].r==0) seg[i].r=i;
    }
    sort(seg+1,seg+n+1,cmps);
    modify(1,1,n+10,1,1);
    for(int i=1;i<=n;i+=1){
        int cur=query(1,1,n+10,seg[i].l,seg[i].r+1);
        modify(1,1,n+10,seg[i].r+1,cur);
    }
    cout << query(1,1,n+10,n+1,n+1);
    return 0;
}


Measured memory_bytes: 13568