func_code_string: #include <bits/stdc++.h>   using namespace std;   const double eps = 1e-6;   int N, M, Q;   vector<int> V[100002], W[100002];   int X[100002], Y[100002], T[100002], weight[100002];   int A[100002];   bool S[100002];   int xglob, yglob;   inline bool compare(const int& i1, const int& i2) {     return atan2(Y[i1] - yglob, X[i1] - xglob) <            atan2(Y[i2] - yglob, X[i2] - xglob);   }   void Dfs(int x) {     S[x] = true;     weight[x] = 1;     W[x].resize(V[x].size());     for (int i = 0; i < int(V[x].size()); ++i)       if (!S[V[x][i]]) {         T[V[x][i]] = x;         Dfs(V[x][i]);         weight[x] += weight[V[x][i]];         W[x][i] = -weight[V[x][i]];       }     for (int i = 0; i < int(V[x].size()); ++i)       if (V[x][i] == T[x]) W[x][i] = weight[x];     for (int i = 1; i < int(W[x].size()); ++i) W[x][i] += W[x][i - 1];   }   int main() {     cin >> N >> M;     for (int i = 1, nod1, nod2; i <= M; ++i) {       cin >> nod1 >> nod2;       V[nod1].push_back(nod2);       V[nod2].push_back(nod1);     }     int minx = -1;     for (int i = 1; i <= N; ++i) {       cin >> X[i] >> Y[i];       if (minx == -1 || X[i] < X[minx]) minx = i;     }     X[N + 1] = -0x3f3f3f3f, Y[N + 1] = -0x3f3f3f3f;     V[minx].push_back(N + 1);     V[N + 1].push_back(minx);     for (int i = 1; i <= N; ++i) {       xglob = X[i], yglob = Y[i];       sort(V[i].begin(), V[i].end(), compare);     }     Dfs(N + 1);     cin >> Q;     for (int i = 1; i <= Q; ++i) {       cin >> A[0];       long long area = 0;       for (int j = 1; j <= A[0]; ++j) {         cin >> A[j];         if (j >= 2)           area += 1LL * X[A[j - 1]] * Y[A[j]] - 1LL * X[A[j]] * Y[A[j - 1]];       }       area += 1LL * X[A[A[0]]] * Y[A[1]] - 1LL * X[A[1]] * Y[A[A[0]]];       if (area < 0) reverse(A + 1, A + A[0] + 1);       A[A[0] + 1] = A[1];       ++A[0];       A[A[0] + 1] = A[2];       ++A[0];       int result = 0;       for (int j = 2; j <= A[0] - 1; ++j) {         int step = 1 << 16, nod1, nod2;         for (nod1 = -1; step; step >>= 1)           if (nod1 + step < int(V[A[j]].size()) &&               atan2(Y[V[A[j]][nod1 + step]] - Y[A[j]],                     X[V[A[j]][nod1 + step]] - X[A[j]]) -                       atan2(Y[A[j - 1]] - Y[A[j]], X[A[j - 1]] - X[A[j]]) <                   eps)             nod1 += step;         step = 1 << 16;         for (nod2 = -1; step; step >>= 1)           if (nod2 + step < int(V[A[j]].size()) &&               atan2(Y[V[A[j]][nod2 + step]] - Y[A[j]],                     X[V[A[j]][nod2 + step]] - X[A[j]]) -                       atan2(Y[A[j + 1]] - Y[A[j]], X[A[j + 1]] - X[A[j]]) <                   eps)             nod2 += step;         if (nod1 < nod2)           result += W[A[j]][nod2 - 1] - W[A[j]][nod1];         else           result += W[A[j]][W[A[j]].size() - 1] -                     (W[A[j]][nod1] - (nod2 == 0 ? 0 : W[A[j]][nod2 - 1]));       }       cout << result <<   n ;     }   }   