#include<bits/stdc++.h>
using namespace std;
#define ll long long
const ll Mod=1e9+7;
const int NN=4e5+5;
int n,a[NN],b[NN],t,s[NN];
int N;
ll v[NN*20];
int ls[NN*20],rs[NN*20],root[NN],tot;
void Update(int o1,int &o2,int l,int r,int p,int val){
if(o2==0){
tot++;
o2=tot;
}
ls[o2]=ls[o1];
rs[o2]=rs[o1];
v[o2]=(v[o1]+val)%Mod;
if(l==r){
return ;
}
int mid=l+(r-l)/2;
if(p<=mid){
ls[o2]=0;
Update(ls[o1],ls[o2],l,mid,p,val);
}else{
rs[o2]=0;
Update(rs[o1],rs[o2],mid+1,r,p,val);
}
}
ll Query(int o,int l,int r,int tl,int tr){
if(tl<=l&&r<=tr){
// cout<<l<<" "<<r<<" "<<v[o]<<'\n';
return v[o];
}
if(o==0){
return 0;
}
ll ret=0;
int mid=l+(r-l)/2;
if(tl<=mid){
ret+=Query(ls[o],l,mid,tl,tr);
ret%=Mod;
}
if(mid<tr){
ret+=Query(rs[o],mid+1,r,tl,tr);
ret%=Mod;
}
// cout<<l<<" "<<r<<" "<<ret<<'\n';
return ret;
}
bool cmp(const int&x,const int&y){
return b[x]<b[y];
}
struct task{
int a,b;
}ta[NN];
bool cmp2(const task&x,const task&y){
return x.b<y.b;
}
ll ans;
void solve(int now){
int nxt=now-1;
while(a[s[nxt]]<a[s[now]]&&nxt>0){
nxt--;
}
if(nxt==0){
return ;
}else{
ans+=Query(root[b[s[nxt]]],1,N,a[s[now]]+1,b[s[nxt]])+1-Query(root[b[s[nxt]]],1,N,a[s[nxt]],a[s[nxt]]);
// cout<<now<<":"<<a[s[now-1]]+1<<" "<<b[s[now]]<<" "s<<Query(root[s[now]],1,N,a[s[now-1]]+1,b[s[now]])<<'\n';
ans=(ans%Mod+Mod)%Mod;
solve(nxt);
}
}
int main(){
// freopen("ott.in","r",stdin);
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin>>n;
N=n*2;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
ta[i].a=a[i];
ta[i].b=b[i];
}
cin>>t;
for(int i=1;i<=t;i++){
cin>>s[i];
}
sort(s+1,s+t+1,cmp);
sort(ta+1,ta+n+1,cmp2);
for(int i=1;i<=n;i++){
// cout<<"at "<<ta[i].a<<" "<<ta[i].b<<'\n';
if(ta[i].b==b[s[t]]){
ans+=1;
ans%=Mod;
// cout<<"before solve "<<ans<<'\n';
solve(t);
// cout<<"after solve"<<ans<<'\n';
break;
}else{
ll val=Query(root[ta[i-1].b],1,N,ta[i].a,ta[i].b-1);
// cout<<val+1<<'\n';
val=((val+1)%Mod+Mod)%Mod;
ans=(ans+val)%Mod;
Update(root[ta[i-1].b],root[ta[i].b],1,N,ta[i].a,val);
}
}
cout<<ans;
return 0;
}
561. Array Partition I | 1374. Generate a String With Characters That Have Odd Counts |
1822. Sign of the Product of an Array | 1464. Maximum Product of Two Elements in an Array |
1323. Maximum 69 Number | 832. Flipping an Image |
1295. Find Numbers with Even Number of Digits | 1704. Determine if String Halves Are Alike |
1732. Find the Highest Altitude | 709. To Lower Case |
1688. Count of Matches in Tournament | 1684. Count the Number of Consistent Strings |
1588. Sum of All Odd Length Subarrays | 1662. Check If Two String Arrays are Equivalent |
1832. Check if the Sentence Is Pangram | 1678. Goal Parser Interpretation |
1389. Create Target Array in the Given Order | 1313. Decompress Run-Length Encoded List |
1281. Subtract the Product and Sum of Digits of an Integer | 1342. Number of Steps to Reduce a Number to Zero |
1528. Shuffle String | 1365. How Many Numbers Are Smaller Than the Current Number |
771. Jewels and Stones | 1512. Number of Good Pairs |
672. Richest Customer Wealth | 1470. Shuffle the Array |
1431. Kids With the Greatest Number of Candies | 1480. Running Sum of 1d Array |
682. Baseball Game | 496. Next Greater Element I |