#include #include #include using namespace std; int n,m,a[100000],b[100000],is[100000],rt[5],tn[5]; struct tt{int l,r,v;} t[3][100000]; int merge(int x,int y,int aa){ if (!x||!y) return x+y; if (t[aa][x].v>t[aa][y].v) swap(x,y); t[aa][x].r=merge(t[aa][x].r,y,aa); swap(t[aa][x].l,t[aa][x].r); return x;} int main(){ int zyb;scanf("%d",&zyb); for (;zyb--;){ scanf("%d%d",&n,&m);int del=0,add=0; memset(rt,0,sizeof(rt));memset(tn,0,sizeof(tn)); for (int i=1;i<=n;i++) is[i]=0; for (int i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]); for (int i=1;i<=m;i++){ int x;scanf("%d",&x); is[x]++;} for (int i=1;i<=n;i++){ while (rt[a[i]^1]&&t[a[i]^1][rt[a[i]^1]].v+add