这题注意两点就行了
1、用后缀和处理发功的问题 然后在把能力值加上这发功的
2、反方向跑一遍能力值 当前的糖糖不被消灭的要求是后面同组的最大值小于他
详细看代码理解

#include <bits/stdc++.h>
#define ll long long
int const N=5e4+5;
using namespace std;
int n,t,m,cnt[N];
struct T{
int x,y;
}a[N];
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>m;
        for(int i=1;i<=n;i++) cin>>a[i].x>>a[i].y,cnt[i]=0;
        for(int i=1;i<=m;i++){
            int q;cin>>q;
            cnt[q]++;
        }
        int max0=-1,max1=-1;
        int ans=0;
        for(int i=n;i>0;i--){
           cnt[i]+=cnt[i+1];///后缀和
           a[i].y+=cnt[i];///更新当前糖糖的能力值
            if(a[i].x==0){///组别为0
                if(a[i].y>=max1) ans++;///后面1组的最大值是否大于
                max0=max(max0,a[i].y);///更新组别0的最大值
            }
            else
            {
                if(a[i].y>=max0) ans++;///后面0组的最大值是否大于
                 max1=max(max1,a[i].y);///更新组别1的最大值
            }
        }
        cout<<ans<<endl;
        memset(cnt,n,sizeof(cnt));///清空后缀数组
    }
    return 0;
}