//include
//------------------------------------------
#include <vector>
#include <list>
#include <map>
#include <climits>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <string>
#include <cstring>
#include <ctime>
#include <queue>
#include <random>
#include <cctype>
#include <complex>
#include <regex>

using namespace std;

#define C_MAX(a, b) ((a)>(b)?(a):(b))
#define SHOW_VECTOR(v) {std::cerr << #v << "\t:";for(const auto& xxx : v){std::cerr << xxx << " ";}std::cerr << "\n";}
#define SHOW_MAP(v){std::cerr << #v << endl; for(const auto& xxx: v){std::cerr << xxx.first << " " << xxx.second << "\n";}}

#define EPS 1e-8
#define EQ (abs((a) - (b)) < EPS)
#define re() real()
#define im() imag()

inline int signum(double x) { return abs(x) < EPS ? 0 : x > 0 ? 1 : -1; };

typedef complex<double> P;
typedef pair<P, P> L;
typedef vector<P> Poly;

//constないとError
namespace std {
    bool operator<(const P &a, const P &b) {
        return a.real() == b.real() ? a.imag() < b.imag() : a.real() < b.real();
    }
}

double dot(P a, P b) {
    return a.real() * b.real() + a.imag() * b.imag();
}

double cross(P a, P b) {
    return a.real() * b.imag() - a.imag() * b.real();
}

int ccw(P a, P b, P c) {
    b -= a;
    c -= a;
    int sign = signum(cross(b, c));
    if (abs(sign) == 1) return sign;
    if (signum(dot(b, c)) < 0) return -2;
    if (abs(b) < abs(c)) return 2;
    return 0;
}

//ソート禁止
double poly_diameter(Poly poly) {
    int n = poly.size();
    if (n == 2) return abs(poly[0] - poly[1]);

    int i = 0, j = 0;
    for (int k = 0; k < n; k++) {
        if (!(poly[i] < poly[k])) i = k;
        if (poly[j] < poly[k]) j = k;
    }

    double res = 0;
    int si = i, sj = j;
    while (i != sj || j != si) {
        res = max(res, abs(poly[i] - poly[j]));
        if (cross(poly[(i + 1) % n] - poly[i], poly[(j + 1) % n] - poly[j]) < 0) i = (i + 1) % n;
        else j = (j + 1) % n;
    }

    return res;
}

double area_poly(Poly poly) {
    double res = 0.0;
    int n = poly.size();
    for (int i = 0; i < n; i++) res += cross(poly[i], poly[(i + 1) % n]);
    return abs(res) / 2.0;
}

P inter_li_li(P a1, P a2, P b1, P b2) {
    P a = a2 - a1;
    P b = b2 - b1;
    return a1 + cross(b, b1 - a1) / cross(b, a) * a;
}

Poly cut_poly(Poly poly, L line) {
    Poly g;
    int n = poly.size();
    P l1 = line.first;
    P l2 = line.second;
    for (int i = 0; i < n; i++) {
        P a = poly[i];
        P b = poly[(i + 1) % n];
        int s1 = signum(cross(l2 - l1, a - l1));
        int s2 = signum(cross(l2 - l1, b - l1));
        if (s1 >= 0) g.push_back(a);
        if (s1 * s2 < 0) g.push_back(inter_li_li(a, b, line.first, line.second));
    }
    return g;
}

int main() {

    int N;
    cin >> N;

    Poly poly(N);
    for (int i = 0; i < N; i++) {
        double x, y;
        cin >> x >> y;
        poly[i] = P(x, y);
    }

    int M;
    cin >> M;
    for (int i = 0; i < M; i++) {
        double x1, y1, x2, y2;
        cin >> x1 >> y1 >> x2 >> y2;
        L li(P(x1, y1), P(x2, y2));
        auto res = cut_poly(poly, li);
        cout << fixed << setprecision(10) << area_poly(res) << endl;
    }

}














































Measured memory_bytes: 3292