#include <bits/stdc++.h>
#define int long long
using namespace std;
pair<int,int> z[1000005];
vector <pair<int,int>> v;
set <int> s;
vector <int> v1[1000005];
int a;
struct BIT{
        int bit[2000005]={0};
        void update(int i,int val){
             i++;
             while(i<=2*a){
                bit[i]+=val;
                i+=i&-i;
             }
        }
        int query(int i){
             i++;
             int res=0;
             while (i>0){
                 res+=bit[i];
                 i-=i&-i;
             }
             return res;
        }
};
BIT f,f1;
int res=1;
bool vis[1000005];
void dfs(int i){
//     cout << i << " ";
     vis[i]=true;
     for (auto p:v1[i]){
         dfs(p);
     }
}
int mod=1e9+7;
signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> a;
    for (int i=1;i<=a;i++){
         cin >> z[i].first >> z[i].second;
    }
    sort(z+1,z+1+a);
    for (int i=1;i<=a;i++){
         v.push_back({z[i].first,i});
         v.push_back({z[i].second,-i});
    }
    sort(v.begin(),v.end());
    for (auto [x,y]:v){
        // cout << x << " " << y << "\n";
         if (y>0){
             int val=f.query(z[y].second);
             if (val>1){
                 cout << 0 << "\n";
                 return 0;
             }
             if (val==1){
                 int par=f1.query(z[y].second);
//                 if (y==3){
//                     cout << par << "\n";
//                 }
                 v1[par].push_back(y);
             }
             f.update(z[y].second,1);
             f1.update(z[y].second,y);
         }else{
             f.update(z[-y].second,-1);
             f1.update(z[-y].second,y);
         }
    }
    for (int i=1;i<=a;i++){
         if (!vis[i]){
//             cout << "\n";
             res=res*2%mod;
             dfs(i);
//             cout << "\n";
         }
    }
    cout << res << "\n";
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |