#include using namespace std; void gi(int &x) {char ch = getchar(); x = 0; while (ch < '0' || ch > '9') ch = getchar(); while (ch >= '0' && ch <= '9') x = x * 10 + ch - 48, ch = getchar();} void pi(int x) {if (x > 9) pi(x / 10); putchar(x % 10 + 48);} //begin persistent segment tree const int sz = 5000000; int a[sz], l[sz], r[sz], N, tn; int add(int x, int p, int s = tn) { int u = ++N; a[u] = a[x] + 1; l[u] = l[x]; r[u] = r[x]; if (s == 1) return u; else if (p < (s >> 1)) l[u] = add(l[x], p, s >> 1); else r[u] = add(r[x], p - (s >> 1), s >> 1); return u; } int sum(int x, int p, int s = tn) { if (s == 1) return a[x]; else if (p < (s >> 1)) return sum(l[x], p, s >> 1); else return a[l[x]] + sum(r[x], p - (s >> 1), s >> 1); } //end persistent segment tree int n, q, cnt, x[233333], s[233333], root[233333];//x is query; s is used in brute force; root is the roots of persistent segment tree pair itv[233333];//intervals #define L first #define R second int B; //actually query (l1+1, r1, l2+1, r2) int query(int l1, int r1, int l2, int r2) { return sum(root[r1], r2) + sum(root[l1], l2) - sum(root[l1], r2) - sum(root[r1], l2); } void doit() { int i, j, ans; N = 0; gi(n); for (tn = 1; tn <= n; tn <<= 1); for (i = 1; i <= n; i++) gi(itv[i].L), gi(itv[i].R); sort(itv + 1, itv + n + 1); for (i = j = 1; i <= n; i++) { root[i] = root[i - 1]; for (; j <= n && itv[j].L <= i; j++) root[i] = add(root[i], itv[j].R); } B = int(sqrt(n / log(n)) * 0.8); gi(q); while (q--) { gi(cnt); ans = 0; for (i = 1; i <= cnt; i++) gi(x[i]); if (cnt <= B) { sort(x + 1, x + cnt + 1); x[cnt + 1] = n + 1; for (i = 1; i <= cnt; i++) for (j = i; j <= cnt; j += 2) ans += query(x[i - 1], x[i], x[j] - 1, x[j + 1] - 1); } else { for (i = 1; i <= n; i++) s[i] = 0; for (i = 1; i <= cnt; i++) s[x[i]]++; for (i = 1; i <= n; i++) s[i] += s[i - 1]; for (i = 1; i <= n; i++) ans += (1 & (s[itv[i].R] ^ s[itv[i].L - 1])); } pi(ans); putchar('\n'); } } int main() {int T; gi(T); while (T--) doit(); return 0;}