#include<bits/stdc++.h>
typedef long long ll;
#define pb push_back
#define fr first
#define sc second
#define endl '\n'
using namespace std;
#define mid ((left+right)>>1)
int n;
pair<int,int>ara[1000023];
vector<int>komsu[1000023],v[8000023];
int vis[1000023];
int l,r,val;
void up(int node=1,int left=1,int right=-1){
if(right==-1)right=2*n;
v[node].pb(r);
if(left==right)return;
if(l>mid)up(node*2+1,mid+1,right);
else up(node*2,left,mid);
}
void update(int tar,int val){
l=tar;r=val;
up();
}
void qu(int node=1,int left=1,int right=-1){
if(right==-1)right=2*n;
if(left>r||right<l)return;
if(left>=l&&right<=r){
while(v[node].size()>1){
komsu[val].pb(v[node].back());
komsu[v[node].back()].pb(val);
v[node].pop_back();
}
if(v[node].size()){
komsu[val].pb(v[node][0]);
komsu[v[node][0]].pb(val);
}
return;
}
qu(node*2,left,mid);
qu(node*2+1,mid+1,right);
}
void query(int left,int right,int x){
l=left;r=right;
val=x;
qu();
}
signed main(){
ios_base::sync_with_stdio(23^23);cin.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>ara[i].fr>>ara[i].sc;
}
sort(ara+1,ara+n+1);
for(int i=1;i<=n;i++){
query(ara[i].fr,ara[i].sc,i);
update(ara[i].sc,i);
}
int ans=1;
for(int i=1;i<=n;i++){
if(vis[i])continue;
ans*=2;
if(ans>=1e9+7)ans-=1e9+7;
queue<int>q;
q.push(i);
vis[i]=1;
while(q.size()){
int pos=q.front();
q.pop();
for(int x:komsu[pos]){
if(vis[x]){
if(vis[x]==vis[pos])ans=0;
continue;
}
vis[x]=(vis[pos]^3);
q.push(x);
}
}
}
cout<<ans<<endl;
}
| # | 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... |