Solution:
如果直接从前往后,则后面的又会影响到之前到,所有干脆从后往前考虑,这样就不会对之前计算到的造成影响。
从后往前维护两个队伍各自的最大值和会被增加的战斗力,如果前面的战斗力小于另一个战队的当前最大值,则被消灭,保证了每个人只会被计算一次。

#include <bits/stdc++.h>
using namespace std;
#define x first
#define y second
typedef long long ll;
const ll N = 2e5 + 5;
pair<int, ll> p[N];
ll t, n, m, b[N];
int main() {
  cin >> t;
  while (t--) {
    memset(b, 0, sizeof(b));
    cin >> n >> m;
    for (int i = 1; i <= n; i++) cin >> p[i].x >> p[i].y;
    for (int i = 1; i <= m; i++) {
      int x;
      cin >> x;
      b[x]++;
    }
    ll ma0 = 0, ma1 = 0, res = 0;
    for (int i = n; i >= 1; i--) {
      b[i] += b[i + 1];
      p[i].y += b[i];
      if (p[i].x) {
        ma1 = max(ma1, p[i].y);
        if (p[i].y < ma0) res++;
      } else {
        ma0 = max(ma0, p[i].y);
        if (p[i].y < ma1) res++;
      }
    }
    cout << n - res << '\n';
  }
  return 0;
}