#include <cstdio>
#include <iostream>
#include <sstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <climits>
#include <cfloat>
using namespace std;

const double EPS = 1.0e-10;

int n;            // 柵の数
vector<int> b, h; // 柵の位置、柵の高さ

int m;            // 蛇口の数
vector<int> f, a; // 蛇口の位置、蛇口の水の流量

class Data{
public:
    int area;   // 底面積
    int w;      // 水量
    int x1, x2; // 左右の塀の位置
    int h1, h2; // 左右の柵の高さ
    Data(int area0, int w0, int x01, int x02, int h01, int h02){
        area = area0;
        w = w0;
        x1 = x01;
        x2 = x02;
        h1 = h01;
        h2 = h02;
    }
    int overflow(){
        return max(0, w - area * min(h1, h2));
    }
    void unite(Data& d){
        area += d.area;
        w += d.w;
        x2 = d.x2;
        h2 = d.h2;
    }
    double getHeight(){
        return w / (double) area;
    }
};

double solve(int p, int t)
{
    vector<int> w(n+1); // 水量
    for(int i=0; i<m; ++i)
        w[lower_bound(b.begin(), b.end(), f[i])-b.begin()-1] += a[i] * t;

    list<Data> d;
    for(int i=0; i<n+1; ++i)
        d.push_back(Data(30*(b[i+1]-b[i]), w[i], b[i], b[i+1], h[i], h[i+1]));

    while(d.size() > 1){
        bool change = false;
        for(list<Data>::iterator it1=d.begin(); it1!=d.end(); ++it1){
            Data d2 = *it1;
            list<Data>::iterator it2 = it1;
            int maxHeight = 0; // 内部にある柵の高さの最大値
            while(++it2 != d.end()){
                maxHeight = max(maxHeight, it2->h1);
                d2.unite(*it2);
                if(maxHeight <= d2.getHeight() + EPS && maxHeight <= min(d2.h1, d2.h2)){
                    d.erase(it1, it2);
                    *it2 = d2;
                    change = true;
                    break;
                }
            }
            if(change)
                break;
        }
        if(change)
            continue;

        for(list<Data>::iterator it1=d.begin(); it1!=d.end(); ++it1){
            if(it1->overflow() > 0){
                list<Data>::iterator it2 = it1;
                if(it1->h1 > it1->h2)
                    ++ it2;
                else
                    -- it2;
                it2->w += it1->overflow();
                it1->w -= it1->overflow();
                change = true;
            }
        }
        if(!change)
            break;
    }

    for(list<Data>::iterator it=d.begin(); ; ++it){
        if(it->x2 > p)
            return min(50.0, it->getHeight());
    }
}

int main()
{
    int d;
    cin >> d;

    while(--d >= 0){
        cin >> n;
        b.assign(n+2, 0);
        h.assign(n+2, INT_MAX/2);
        for(int i=1; i<=n; ++i)
            cin >> b[i] >> h[i];
        b[n+1] = 100;

        cin >> m;
        f.resize(m);
        a.resize(m);
        for(int i=0; i<m; ++i)
            cin >> f[i] >> a[i];

        int l;
        cin >> l;               // 測定回数
        vector<int> p(l), t(l); // 測定位置、測定時刻
        for(int i=0; i<l; ++i)
            cin >> p[i] >> t[i];

        for(int i=0; i<l; ++i)
            printf("%.10f\n", solve(p[i], t[i]));
    }

    return 0;
}

Measured memory_bytes: 1240