#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e6+5;
const int mod=1e9+7;
const int inv=5e8+4;
struct fenwicktree
{
int fen[MAXN];
int getlog(long long n) { return 63-__builtin_clzll(n); }
void update(int i,int n,int val) { for(;i<=n;i+=i&-i) fen[i]+=val; }
int get(int i) { int ans=0;for(;i;i-=i&-i) ans+=fen[i];return ans; }
int walk(int n,int val) { if(val<0) return 1;int ans=0;for(int i=getlog(n);i+1;i--) if(ans+(1<<i)<=n&&val>=fen[ans+(1<<i)]) val-=fen[ans+=(1<<i)];return ans+1; }
};
fenwicktree fa,fb;
pair<int,int> A[MAXN];
int dsu[MAXN],pos[MAXN];
bool ck[MAXN],cc[MAXN];
vector<int> vi[MAXN];
int root(int i)
{
if(!dsu[i]) return i;
return dsu[i]=root(dsu[i]);
}
bool merge(int i,int j)
{
bool c=(cc[i]==cc[j]);
if((i=root(i))==(j=root(j)))
{
if(c)
{
cout<<0;
exit(0);
}
return false;
}
if(vi[i].size()<vi[j].size()) swap(i,j);
if(c) for(auto v:vi[j]) cc[v]=1-cc[v];
for(auto v:vi[j]) vi[i].push_back(v);
vi[j].clear(),dsu[j]=i;
return true;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
int n;
long long ans=1;
cin>>n;
for(int i=1;i<=n;i++) cin>>A[i].first>>A[i].second;
sort(A+1,A+n+1);
for(int i=1;i<=n;i++)
{
ans=ans*2%mod,pos[A[i].first]=pos[A[i].second]=i,vi[i].push_back(i);
int c=fb.get(A[i].first),res=fa.walk(n*2,fa.get(A[i].first));
if(res<=A[i].second&&merge(pos[res],i)) ans=ans*inv%mod;
while((res=fb.walk(n*2,c))<=A[i].second)
{
if(merge(pos[res],i)) ans=ans*inv%mod;
ck[res]=false,fb.update(res,n*2,-1);
}
fa.update(A[i].second,n*2,1);
if(!ck[A[i].second]) ck[A[i].second]=true,fb.update(A[i].second,n*2,1);
int pre=fa.walk(n*2,fb.get(A[i].second)-2);
if(fb.get(A[i].second)>1&&!ck[pre]) ck[pre]=true,fb.update(pre,n*2,1);
int nex=fa.walk(n*2,fb.get(A[i].second));
if(fb.get(A[i].second)<i&&!ck[nex]) ck[nex]=true,fb.update(pre,n*2,1);
}
cout<<ans;
}