可以提前把施法后的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;
}