/*
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦
¦¦¦_¯_¯_¯_¯_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
*/
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ff first
#define ss second
//#define int long long
int l,r,n,t,m,mid,ans,sum,sum1,sum2,sum0,k,mod=1e9+7,c[2000005],a[1000005],b[1000005],val[1000005];
bool vis[1000005];
pair <int,int> d_l[2000005],d_r[2000005];
vector <int> v,v1;
map <int,int> mp;
string s,s1;
bool b1;
pair <int,int> query_r(int v,int tl,int tr,int l,int r){
if(l>r){
return make_pair(0,0);
}
// cout<<v<<" "<<tl<<" "<<tr<<" "<<l<<" "<<r<<endl;
if(tl==l and tr==r){
return d_r[v];
}else{
int tm=(tl+tr)/2;
return max(query_r(2*v,tl,tm,l,min(r,tm)),query_r(2*v+1,tm+1,tr,max(l,tm+1),r));
}
}
pair <int,int> query_l(int v,int tl,int tr,int l,int r){
if(l>r){
return make_pair(INT_MAX,0);
}
if(tl==l and tr==r){
return d_l[v];
}else{
int tm=(tl+tr)/2;
return min(query_l(2*v,tl,tm,l,min(r,tm)),query_l(2*v+1,tm+1,tr,max(l,tm+1),r));
}
}
void update_l(int v,int tl,int tr,int pos,pair <int,int> val){
if(tl==pos and tr==pos){
d_l[v]=val;
}else{
int tm=(tl+tr)/2;
if(pos<=tm){
update_l(2*v,tl,tm,pos,val);
}else{
update_l(2*v+1,tm+1,tr,pos,val);
}
d_l[v]=min(d_l[2*v],d_l[2*v+1]);
}
}
void update_r(int v,int tl,int tr,int pos,pair <int,int> val){
if(tl==pos and tr==pos){
// cout<<v<<" "<<tr<<" "<<val.ff<<" "<<val.ss<<endl;
d_r[v]=val;
// cout<<d_r[v].ff<<" "<<d_r[v].ss<<endl;
}else{
int tm=(tl+tr)/2;
if(pos<=tm){
update_r(2*v,tl,tm,pos,val);
}else{
update_r(2*v+1,tm+1,tr,pos,val);
}
d_r[v]=max(d_r[2*v],d_r[2*v+1]);
}
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
t=1;
// cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=2*n;i++){
update_l(1,1,2*n,i,make_pair(INT_MAX,i));
update_r(1,1,2*n,i,make_pair(0,i));
}
for(int i=1;i<=n;i++){
cin>>a[i];
cin>>b[i];
update_l(1,1,2*n,b[i],make_pair(a[i],i));
update_r(1,1,2*n,a[i],make_pair(b[i],i));
// cout<<a[i]<<" "<<b[i]<<" "<<i<<endl;
}
ans=1;
for(int i=1;i<=n;i++){
if(!vis[i]){
ans*=2;
ans%=mod;
queue <int> q;
q.push(i);
vis[i]=1;
val[i]=0;
update_l(1,1,2*n,b[i],make_pair(INT_MAX,i));
update_r(1,1,2*n,a[i],make_pair(0,i));
while(!q.empty()){
auto x=q.front();
q.pop();
while(true){
auto k=query_l(1,1,2*n,a[x]+1,b[x]-1);
// cout<<k.ff<<" "<<k.ss<<" l "<<x<<endl;
if(k.ff<a[x]){
q.push(k.ss);
val[k.ss]=1-val[x];
vis[k.ss]=1;
update_l(1,1,2*n,b[k.ss],make_pair(INT_MAX,k.ss));
update_r(1,1,2*n,a[k.ss],make_pair(0,k.ss));
}else{
break;
}
}
while(true){
auto k=query_r(1,1,2*n,a[x]+1,b[x]-1);
// cout<<k.ff<<" "<<k.ss<<" r "<<x<<endl;
if(k.ff>b[x]){
q.push(k.ss);
val[k.ss]=1-val[x];
vis[k.ss]=1;
update_l(1,1,2*n,b[k.ss],make_pair(INT_MAX,k.ss));
update_r(1,1,2*n,a[k.ss],make_pair(0,k.ss));
}else{
break;
}
}
}
}
}
for(int i=1;i<=n;i++){
c[a[i]]=i;
c[b[i]]=-i;
}
stack <int> st[2];
for(int i=1;i<=2*n;i++){
// cout<<val[abs(c[i])]<<" "<<i<<endl;
if(c[i]>0){
st[val[c[i]]].push(c[i]);
}else{
if(st[val[-c[i]]].top()!=abs(c[i])){
cout<<0<<endl;
return 0;
}
st[val[-c[i]]].pop();
}
}
cout<<ans<<endl;
}
}