#include <bits/stdc++.h>
using namespace std;
struct point {
  long double x, y;
  void in() { cin >> x >> y; }
  point operator-(const point& b) { return (point){x - b.x, y - b.y}; }
  point operator*(const point& b) { return (point){x * b.x, y * b.y}; }
  long double operator^(const point& b) { return x * b.y - y * b.x; }
} p[3030], a, b;
int i, j, k, n, m, x, y, q;
vector<pair<long double, int> > poi;
long double ans;
inline int zf(long double x) { return x < -1e-8 ? -1 : x > 1e-8; }
inline long double loc(point u, point v, point w) { return (w ^ u) / (v ^ w); }
inline long double work(point x, point v) {
  for (poi.clear(), i = 1; i <= n; ++i) {
    int f1 = zf(v ^ (p[i] - x)), f2 = zf(v ^ (p[i + 1] - x));
    if (f1 == f2) continue;
    long double o = loc(x - p[i], v, p[i + 1] - p[i]);
    if (f1 > f2)
      poi.push_back(make_pair(o, f1 && f2 ? 2 : 1));
    else
      poi.push_back(make_pair(o, f1 && f2 ? -2 : -1));
  }
  sort(poi.begin(), poi.end());
  for (i = j = ans = 0; i + 1 < poi.size(); ++i)
    if (j += poi[i].second, j) ans += poi[i + 1].first - poi[i].first;
  return ans * hypotl(v.x, v.y);
}
int main() {
  ios_base::sync_with_stdio(0);
  for (cin >> n >> q, i = 1; i <= n; ++i) p[i].in();
  for (p[n + 1] = p[1]; q--;) {
    a.in(), b.in();
    printf("%.15lf\n", (double)work(a, b - a));
  }
}
