Problem:

从前,有n只萌萌的糖糖,他们分成了两组一起玩游戏。他们会排成一排,第i只糖糖会随机得到一个能力值bi。
从第i秒的时候,第i只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。为了使游戏更加有趣,糖糖的爸爸,
娇姐,会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,.....,bci都会增加1.
现在,娇姐想知道在第n秒后,会有多少只糖糖存活下来。

Solution:

只有两组,而对于第 i 只糖糖来说,我们要找的就是满足((a[j] != a[i] && b[j] < b[i])其中j < i)的所有糖糖删去即可。对于如何找到符合条件
的糖糖删去有很多种方法,此处我采用两个优先队列(分别是0编号组的优先队列和1编号组的优先队列),若a[i] = 0 则在 1编号组优先队列中从队头
进行删除符合条件的糖糖。
接下来就是ci秒自增的问题了,由于ci秒是b1,b2,.....,bci都会增加1.所以我们可以维护一个值 inv 表示当前位置自增的值是多少, 对于优先队列里面
的值全部自增1是不会影响其顺序的,可是问题是 inv 所代表的是当前需要自增多少,而前面可能会有不同的自增量(ci = 1,3的情况,(1自增2),
(2,3自增1),而inv的值在这个时候却为2),所以我们需要在bi加入优先队列时对其进行处理,让其保证再加入队列后能在正确的位置且拿出来的时候
加上inv是其正确的值,因此加入队列的时候我们把b[i] - inv加入队列,取出来的时候实际值是b[i] + inv。最终我们输出两个优先队列的size和即可
eg:a = {1,5,1,6}加入优先队列
若再加入第2个后我们要让第1个和第2个都增加1 inv = 1
若再加入第3个后我们要让第1个和第2个和第3个都增加1 inv = 2
若再加入第4个后我们要让第1个和第2个和第3个和第4个都增加1 inv = 3
改变之后 a = {4,8,3,7}
所以如果我们改变完a之后加入队列,最终优先队列里应该是a[2],a[0],a[3],a[1]
而如果我们边加入边改变的话,我们加入的时候就应该加入a = {1,5,1 - 1=0,6 - 2=4},最终优先队列里是 a[2],a[0],a[3],a[1]
与上面一致,所以保证了顺序不变,而取出来的时候此时的inv = 3,a[i]正确的值为a[i] + inv = {4,8,3,7}

#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define _for(i,s,t) for(int i=s;i<t;i++)
#define _rof(i,s,t) for(int i=s;i>t;i--)
#define rep(i,s,t) for(int i=s;i<=t;i++)
#define per(i,s,t) for(int i=s;i>=t;i--)
#define Ri(x) scanf("%d",&x)
#define Rii(x,y) scanf("%d%d",&x,&y)
#define INF 0x3f3f3f3f
using namespace std;
template<class T>inline void read(T &res)
{
    char c;T flag=1;
    while((c=getchar())<'0'||c>'9')if(c=='-')flag=-1;res=c-'0';
    while((c=getchar())>='0'&&c<='9')res=res*10+c-'0';res*=flag;
}
typedef long long ll;
const int maxn = 5e4 + 10;
ll a[maxn],b[maxn],c[maxn];
priority_queue<ll,vector<ll>,greater<ll> > Q0,Q1;
int main(){
    IOS;
    ll T,n,m,v,inv;
    cin>>T;
    while(T --){
        inv = 0;
        cin>>n>>m;
        rep(i,1,n){
            cin>>a[i]>>b[i];
            c[i] = 0;
        }
        rep(i,1,m){
            cin>>v;c[v] ++;
        }
        rep(i,1,n){
            if(a[i] == 0){
                while(!Q1.empty()){
                    if(Q1.top() + inv < b[i]){
                        Q1.pop();
                    }else{
                        break;
                    }
                }
                Q0.push(b[i] - inv);
            }else{
                while(!Q0.empty()){
                    if(Q0.top() + inv < b[i]){
                        Q0.pop();
                    }else{
                        break;
                    }
                }
                Q1.push(b[i] - inv);
            }
            inv += c[i];
        }
        cout<<(Q0.size() + Q1.size())<<endl;
        while(!Q1.empty()) Q1.pop();
        while(!Q0.empty()) Q0.pop();
    }
    return 0;
}
/**
Problem:
    从前,有n只萌萌的糖糖,他们分成了两组一起玩游戏。他们会排成一排,第i只糖糖会随机得到一个能力值bi。
从第i秒的时候,第i只糖糖就可以消灭掉所有排在他前面的和他不是同一组的且能力值小于他的糖糖。为了使游戏更加有趣,糖糖的爸爸,
娇姐,会发功m次,第i次发功的时间为ci,则在第ci秒结束后,b1,b2,.....,bci都会增加1.
现在,娇姐想知道在第n秒后,会有多少只糖糖存活下来。
Solution:
    只有两组,而对于第 i 只糖糖来说,我们要找的就是满足((a[j] != a[i] && b[j] < b[i])其中j < i)的所有糖糖删去即可。对于如何找到符合条件
的糖糖删去有很多种方法,此处我采用两个优先队列(分别是0编号组的优先队列和1编号组的优先队列),若a[i] = 0 则在 1编号组优先队列中从队头
进行删除符合条件的糖糖。
    接下来就是ci秒自增的问题了,由于ci秒是b1,b2,.....,bci都会增加1.所以我们可以维护一个值 inv 表示当前位置自增的值是多少, 对于优先队列里面
    的值全部自增1是不会影响其顺序的,可是问题是 inv 所代表的是当前需要自增多少,而前面可能会有不同的自增量(ci = 1,3的情况,(1自增2),
    (2,3自增1),而inv的值在这个时候却为2),所以我们需要在bi加入优先队列时对其进行处理,让其保证再加入队列后能在正确的位置且拿出来的时候
    加上inv是其正确的值,因此加入队列的时候我们把b[i] - inv加入队列,取出来的时候实际值是b[i] + inv。最终我们输出两个优先队列的size和即可 
        eg:a = {1,5,1,6}加入优先队列
            若再加入第2个后我们要让第1个和第2个都增加1 inv = 1
            若再加入第3个后我们要让第1个和第2个和第3个都增加1 inv = 2
            若再加入第4个后我们要让第1个和第2个和第3个和第4个都增加1 inv = 3
        改变之后 a = {4,8,3,7} 
        所以如果我们改变完a之后加入队列,最终优先队列里应该是a[2],a[0],a[3],a[1] 
        而如果我们边加入边改变的话,我们加入的时候就应该加入a = {1,5,1 - 1=0,6 - 2=4},最终优先队列里是 a[2],a[0],a[3],a[1]
        与上面一致,所以保证了顺序不变,而取出来的时候此时的inv = 3,a[i]正确的值为a[i] + inv = {4,8,3,7}  
*/