Submission #1334149

#TimeUsernameProblemLanguageResultExecution timeMemory
1334149MrAndriaPort Facility (JOI17_port_facility)C++20
78 / 100
6091 ms85840 KiB
/*
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦
¦¦¦_¯_¯_¯_¯_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯_¯_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯_¯_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦¦¦_¯¦¦¦¦¦¦¦¦¦¦¦¦¦¦_¯¦¦¦¦¦_¯_¯_¯_¯¦¦¦¦¦¦¦_¯¦¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯_¯_¯¦¦¦¦¦_¯¦¦¦¦¦¦_¯¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
*/
#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;
        

    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...