#include <bits/stdc++.h>
#define all(x) x.begin(),x.end()
std::mt19937 rng(69);
#define UNUSED -1
const int N_MAX=200'000;
const int mod=1e9+7;
using i64=long long;
struct Aib
{
int n;
std::vector<int>maxx;
int lsb(int x)
{
return x&(-x);
}
void update(int poz,int val)
{
for(int i=poz;i<=n;i+=lsb(i))
{
maxx[i]=std::max(maxx[i] , val);
}
}
int query(int poz)
{
int rez=0;
for(int i=poz;i>0;i-=lsb(i))
{
rez=std::max(rez , maxx[i]);
}
return rez;
}
void init(int n)
{
this->n=n;
maxx=std::vector<int>(n+1,0);
}
};
struct interval
{
int l,r,rezl,rezr;
};
int main()
{
//freopen("input.txt","r",stdin);
std::ios::sync_with_stdio(false);
std::cin.tie(0);
int n;
std::cin>>n;
std::vector<interval>a(n);
std::vector<i64>cash(2*n+1);
for(auto &c:a)
{
std::cin>>c.l>>c.r;
cash[c.l]=cash[c.r]=rng();
}
int rez=1;
std::set<int>mp;
mp.insert(0);
for(int i=1;i<=2*n;i++)
{
cash[i]^=cash[i-1];
if(mp.count(cash[i]))
{
rez*=2;
rez%=mod;
}
mp.insert(cash[i]);
}
std::sort(all(a) , [&](interval x,interval y){
return x.l<y.l;
});
Aib aib;
aib.init(2*n);
for(auto &c:a)
{
c.rezl=aib.query(c.r);
aib.update(c.r,c.r);
}
std::sort(all(a) , [&](interval x,interval y){
return x.r>y.r;
});
aib.init(2*n);
for(auto &c:a)
{
c.rezr=2*n-aib.query(2*n-c.l+1)+1;
aib.update(2*n-c.l+1 , 2*n-c.l+1);
}
///std::cout<<'\n';
for(auto &c:a)
{
rez*=(c.rezl<=c.rezr);
}
std::cout<<rez<<'\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... |