#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll, ll> l_l;
typedef pair<int, int> i_i;

#define EPS (1e-7)
#define INF (1e9)
#define PI (acos(-1))
//const ll mod = 1000000007;

template<typename T>
bool chmin(T &a, T b) {
    if(a > b) {
        a = b;
        return true;
    }
    return false;
}

struct pool {
    double lh, rh, lx, rx, h, in;
    pool(double a, double b, double c, double d, double e, double f) {
        lh = a;
        rh = b;
        lx = c;
        rx = d;
        h = e;
        in = f;
    }
};

vector<pool> pools;
double B[105], H[105], F[105], A[105], P[105], T[105];
double ans[105];
int inv[105];

int main() {
    cout.precision(10);
    int Datasets;
    cin >> Datasets;
    while(Datasets--) {
        pools.clear();
        ll N, M, L;
        cin >> N;
        for(int i = 2; i <= N + 1; i++) cin >> B[i] >> H[i];
        B[0] = -100;
        H[0] = 1e10;
        B[1] = 0;
        H[1] = 50;
        B[N+2] = 100;
        H[N+2] = 50;
        B[N+3] = 1000;
        H[N+3] = 1e10;
        cin >> M;
        for(int i = 0; i <= N + 2; i++) {
            pools.emplace_back(H[i], H[i+1], B[i], B[i+1], 0, 0);
        }
        for(int i = 1; i <= M; i++) cin >> F[i] >> A[i];
        for(int i = 1; i <= M; i++) {
            int j = 0;
            while(pools[j].rx < F[i]) j++;
            pools[j].in += A[i] / 30.0;
        }
        cin >> L;
        vector<pair<l_l, ll>> v(L);
        //for(int i = 1; i <= L; i++) cin >> P[i] >> T[i];
        for(int i = 0; i < L; i++) {
            //cerr << i << endl;
            cin >> v[i].first.second >> v[i].first.first;
            v[i].second = i + 1;
        }
        sort(v.begin(), v.end());
        for(int i = 0; i < v.size(); i++) {
            //cerr << i << endl;
            P[i+1] = v[i].first.second;
            T[i+1] = v[i].first.first;
            inv[i+1] = v[i].second;
            //cerr << i + 1 << " " << P[i+1] << " " << T[i+1] << " " << inv[i+1] << endl;
        }
        double time = 0.0;
        int timeindex = 1;
        while(timeindex <= L) {
            //if(time > 7000) break;
            //cerr << "-----" << time << " " << timeindex << "-----" << endl;
            for(int i = 0; i < pools.size(); i++) {
                pool now = pools[i];
                //cerr << now.lx << " " << now.rx << " " << now.lh << " " << now.rh << " " << now.in << " " << now.h << endl;
            }
            //cerr << timeindex << " " << time << endl;
            double dt = T[timeindex] - time;
            for(int i = 0; i < pools.size(); i++) {
                if(pools[i].in <= EPS) continue;
                pool now = pools[i];
                double nowdt = (min(now.rh, now.lh) - now.h) * (now.rx - now.lx) / now.in;
                chmin(dt, nowdt);
            }
            for(int i = 0; i < pools.size(); i++) {
                pool now = pools[i];
                pools[i].h += dt * now.in / (now.rx - now.lx);
            }
            time += dt;
            if(time + EPS >= T[timeindex]) {
                int index = 0;
                while(pools[index].rx < P[timeindex]) index++;
                //cout << min(50.0, pools[index].h) << endl;
                ans[inv[timeindex]] = min(50.0, pools[index].h);
                timeindex++;
            }
            for(int _ = 0; _ <= 20; _++) {
                for(int i = 0; i + 1 < pools.size(); i++) {
                    if(pools[i].in < EPS) continue;
                    if(i > 0 && pools[i].h + EPS < min(pools[i].lh, pools[i].rh)) continue;
                    if(i == 0 && pools[i].h + EPS < pools[i].rh) continue;
                    bool ToLeft = false, ToRight = false;
                    if(i > 0 && pools[i].lh < pools[i].h + EPS && pools[i-1].h < pools[i].h) ToLeft = true;
                    if(pools[i].rh < pools[i].h + EPS && pools[i+1].h < pools[i].h) ToRight = true;
                    if(ToLeft && ToRight) {
                        pools[i-1].in += pools[i].in / 2.0;
                        pools[i+1].in += pools[i].in / 2.0;
                        pools[i].in = 0;
                        continue;
                    }
                    if(ToLeft) {
                        pools[i-1].in += pools[i].in;
                        pools[i].in = 0;
                        continue;
                    }
                    if(ToRight) {
                        pools[i+1].in += pools[i].in;
                        pools[i].in = 0;
                        continue;
                    }
                    if(i > 0 && pools[i].lh < pools[i].h + EPS) {
                        pools[i-1].in += pools[i].in;
                        pools[i-1].rh = pools[i].rh;
                        pools[i-1].rx = pools[i].rx;
                        pools.erase(pools.begin() + i);
                        i--;
                        continue;
                    }
                    if(pools[i].rh < pools[i].h + EPS) {
                        pools[i+1].in += pools[i].in;
                        pools[i+1].lh = pools[i].lh;
                        pools[i+1].lx = pools[i].lx;
                        pools.erase(pools.begin() + i);
                        i--;
                        continue;
                    }
                }
            }
        }
        for(int i = 1; i <= L; i++) cout << ans[i] << endl;
    }
    return 0;
}


Measured memory_bytes: 3136