#include <bits/stdc++.h>   using namespace std;   template <typename T>   void _R(T &x) {     cin >> x;   }   void _R(int &x) { scanf( %d , &x); }   void _R(long long &x) { scanf( %  PRId64, &x); }   void _R(double &x) { scanf( %lf , &x); }   void _R(char &x) { scanf(  %c , &x); }   void _R(char *x) { scanf( %s , x); }   void R() {}   template <typename T, typename... U>   void R(T &head, U &...tail) {     _R(head);     R(tail...);   }   template <typename T>   void _W(const T &x) {     cout << x;   }   void _W(const int &x) { printf( %d , x); }   template <typename T>   void _W(const vector<T> &x) {     for (auto i = x.cbegin(); i != x.cend(); i++) {       if (i != x.cbegin()) putchar(   );       _W(*i);     }   }   void W() {}   template <typename T, typename... U>   void W(const T &head, const U &...tail) {     _W(head);     putchar(sizeof...(tail) ?     :   n );     W(tail...);   }   const int N = 1e5 + 10;   struct E {     int to, flow;     long double ang;   };   bool operator<(const E &a, const E &b) { return a.ang < b.ang; }   int n, m;   long long x[N], y[N];   vector<E> e[N];   vector<int> sf[N];   inline long double get_ang(int a, int b) {     map<pair<int, int>, long double> memo;     auto k = make_pair(a, b);     if (memo.count(k))       return memo[k];     else       return memo[k] = atan2l(y[b] - y[a], x[b] - x[a]);   }   double cross(int a, int b) { return x[a] * y[b] - x[b] * y[a]; }   bool vis[N];   int dfs(int p) {     vis[p] = 1;     int s = 1;     for (auto &i : e[p])       if (!vis[i.to]) {         int f = dfs(i.to);         i.flow = -f;         for (auto &j : e[i.to])           if (j.to == p) j.flow = f;         s += f;       }     return s;   }   int main() {     R(n, m);     for (int i = 0; i < int(m); i++) {       int a, b;       R(a, b);       e[a].push_back({b, 0, 0});       e[b].push_back({a, 0, 0});     }     for (int i = (1); i <= int(n); i++) R(x[i], y[i]);     int w = 1;     for (int i = (1); i <= int(n); i++)       if (x[i] < x[w]) w = i;     x[0] = x[w] - 1;     e[0].push_back({w, 0, 0});     e[w].push_back({0, 0, 0});     dfs(0);     for (int i = (0); i <= int(n); i++) {       for (auto &j : e[i]) j.ang = get_ang(i, j.to);       sort(begin(e[i]), end(e[i]));       sf[i].push_back(0);       for (auto &j : e[i]) sf[i].push_back(sf[i].back() + j.flow);       ;     }     int q;     R(q);     while (q--) {       static int np, p[N];       R(np);       for (int i = 0; i < int(np); i++) R(p[i]);       p[np] = p[0];       double area = 0;       for (int i = 0; i < int(np); i++) area += cross(p[i], p[i + 1]);       if (area < 0) reverse(p, p + np + 1);       p[np + 1] = p[1];       int ans = 0;       for (int ii = 0; ii < int(np); ii++) {         int i = p[ii], j = p[ii + 1], k = p[ii + 2];         auto aji = get_ang(j, i);         auto ajk = get_ang(j, k);         int ti = lower_bound(begin(e[j]), end(e[j]), E{0, 0, aji}) - e[j].begin();         int tk = lower_bound(begin(e[j]), end(e[j]), E{0, 0, ajk}) - e[j].begin();         assert(ti < ((int)(e[j]).size()) && e[j][ti].to == i);         assert(tk < ((int)(e[j]).size()) && e[j][tk].to == k);         ;         if (ti < tk) {           ans += sf[j][tk] - sf[j][ti + 1];         } else {           ans += sf[j].back() - sf[j][ti + 1];           ans += sf[j][tk];         }       }       W(ans);     }     return 0;   }