可以提前把施法后的b算出来。因为前面的结果会影响后面的判断
#include<bits/stdc++.h>
using namespace std;
int n,m;
const int M=5e4+5;
int a[M],b[M];
int d[M];
int main(){
int t;
cin>>t;
while(t--){
memset(d,0,sizeof(d));
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
for(int i=1;i<=m;i++){
int x; cin>>x;
d[1]++; d[x+1]--;
}
for(int i=1;i<=n;i++){
d[i]=d[i]+d[i-1];
b[i]+=d[i];
}
int max0=-1; int max1=-1;
int cnt=0;
for(int i=n;i>=1;i--){
if(a[i]==0){
max0=max(max0,b[i]);
}
if(a[i]==1){
max1=max(max1,b[i]);
}
if(a[i]==0&&b[i]>=max1) cnt++;
if(a[i]==1&&b[i]>=max0) cnt++;
}
cout<<cnt<<endl;
}
return 0;
}