#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
using vi = vector<int>;
const int INF = 2e9;
const long long LINF = 9e18;
vector<int> tree;
void upd(int idx, int val) {
  while (idx < int(tree.size())) {
    tree[idx] += val;
    idx += (idx & -idx);
  }
}
int query(int idx) {
  int res = 0;
  while (idx > 0) {
    res += tree[idx];
    idx -= (idx & -idx);
  }
  return res;
}
int main() {
  ios::sync_with_stdio(false);
  int n, m;
  cin >> n >> m;
  vector<pair<int, int> > seg(n);
  vector<pair<int, pair<int, int> > > ev;
  for (int i = 0; i < n; ++i) {
    int l, r;
    cin >> l >> r;
    seg[i] = {l, r};
    ev.push_back({l, {-2, 0}});
    ev.push_back({r + 1, {-1, l}});
  }
  tree = vector<int>(1e6 + 10, 0);
  vector<int> sol(m, 0);
  for (int i = 0; i < m; ++i) {
    int cnt;
    cin >> cnt;
    int p = -1;
    int res = 0;
    for (int j = 0; j < cnt; ++j) {
      int x;
      cin >> x;
      ev.push_back({x, {i, p}});
      p = x;
    }
  }
  sort(ev.begin(), ev.end());
  for (int i = 0; i < int(ev.size()); ++i) {
    int p = ev[i].first, x = ev[i].second.first, prev = ev[i].second.second;
    if (x == -2) {
      upd(p, 1);
    } else if (x == -1) {
      upd(prev, -1);
    } else {
      sol[x] += query(p) - query(prev);
    }
  }
  for (int i = 0; i < int(sol.size()); ++i) cout << sol[i] << '\n';
}
