#include <iostream>
#include <cstdio>
#include <vector>
#include <complex>
#include <algorithm>
#include <set>
#include <map>
#include <queue>
#include <string>
#include <cstring>
#include <stack>
#include <cmath>
#include <iomanip>
#include <sstream>

using namespace std;

typedef long long ll;
typedef ll li;
typedef pair<int,int> PI;
#define EPS (1e-8)
#define rep(i,n) for(int i=0;i<(int)(n);++i)
#define REP(i,m,n) for(int i=m; i<=(int)(n); ++i)
#define F first
#define S second
#define mp(a,b) make_pair(a,b)
#define pb(a) push_back(a)
#define SZ(a) (int)((a).size())
#define ALL(a) a.begin(),a.end()
#define FOR(it,a) for(__typeof(a.begin())it=a.begin();it!=a.end();++it)
int dx[]={0,1,0,-1,1,1,-1,-1};
int dy[]={1,0,-1,0,-1,1,1,-1};


void solve(){
  int n;
  cin >> n;
  vector<PI> wall(n+2);
  wall[0]=mp(0,50);
  
  rep(i,n)
    cin >> wall[i+1].F >> wall[i+1].S;
  
  wall[n+1]=mp(100,50);
  
  int m;
  cin >> m;
  set<pair<double,int> > jaguti;
  int sum = 0;
  rep(i,m){
    int x,y;
    cin >> x >> y;
    sum += y;
    jaguti.insert(mp(x,y));
  }

  int L;
  cin >> L;
  PI que[L];
  rep(i,L)
    cin >> que[i].F >> que[i].S;

  double ans[L];//atode
  rep(i,L){
    ans[i] = min(50.,sum*que[i].S/30.0/100.0);
    //cout << ans[i] << endl;
  }

  vector<double> box(n+1);
  double curtime = 0;
  
  while(true){
    double mintime=1e10;
    //cout << n << ' ' << curtime << endl;
    if(curtime>1e6) break;
    rep(i,n+1){
      if(box[i]+EPS<wall[i].S &&
         box[i]+EPS<wall[i+1].S){
        double he=500;
        he=wall[i].S;
        he=min(he,wall[i+1].S*1.);

        he -= box[i];
        
        he *= (wall[i+1].F-wall[i].F) * 30;

        int jag=0;
        FOR(it,jaguti)
          if(wall[i].F < it->F && it->F < wall[i+1].F)
            jag += it->S;
        
        double ti=he/jag;
        mintime = min(mintime,ti);
      }
    }

    rep(qi,L)
      if(curtime <= que[qi].S+EPS && que[qi].S-EPS <= curtime + mintime){
        int i=n;
        rep(j,n+1){
          if(wall[j].F<que[qi].F) continue;
          i = j-1;
          break;
        }
        
        int jag=0;
        FOR(it,jaguti)
          if(wall[i].F < it->F && it->F < wall[i+1].F)
            jag += it->S;
        //cout <<" que " <<  curtime << ' ' << que[qi].S << ' ' << mintime + curtime << endl;
        ans[qi]=(que[qi].S-curtime)*jag/((wall[i+1].F-wall[i].F) * 30) + box[i];
        //cout << ans[qi] << endl;
      }
    
    rep(i,n+1){
      if(box[i]<wall[i].S &&
         box[i]<wall[i+1].S){
        int jag=0;
        FOR(it,jaguti)
          if(wall[i].F < it->F && it->F < wall[i+1].F)
            jag += it->S;
        box[i] += mintime*jag/((wall[i+1].F-wall[i].F) * 30);
      }
    }
    
    bool iserase[n];
    memset(iserase,0,sizeof(iserase));
    
    rep(i,n)
      if(box[i]+EPS >= wall[i+1].S && box[i+1]+EPS >=wall[i+1].S)
        iserase[i] = true;
    int cnt=0;
    rep(i,n){
      if(iserase[n-i-1]){
        ++cnt;
        wall.erase(wall.begin()+n-i);
        box.erase(box.begin()+n-i-1);
      }
    }
    n -= cnt;
    curtime += mintime;
    if(n==0) break;

    while(true){
      set<pair<double,int> > njaguti;
      double di=0;
      bool end=true;
      FOR(it,jaguti){
        di += 0.05;
        bool ok=true;
        rep(i,n+1){
          if(wall[i].F <= it->F && it->F <=wall[i+1].F &&
             box[i]+EPS>=wall[i].S){
            end=ok=false;
            njaguti.insert(mp(wall[i].F-di,it->S));
            break;
          } else if(wall[i].F <= it->F && it->F <=wall[i+1].F &&
                    box[i]+EPS>=wall[i+1].S){
            end=ok=false;
            njaguti.insert(mp(wall[i+1].F+di,it->S));
            break;
          }
        }
        if(ok) njaguti.insert(*it);
      }
      if(end) break;
      jaguti = njaguti;
    }

    /*
    cout << curtime << endl;
    rep(i,n+1) cout << box[i] << ' ';
    cout << endl;
    */

  }

  rep(i,L) printf("%.8f\n",ans[i]);
}

main(){
  int d;
  cin >> d;
  rep(i,d) solve();
}

Measured memory_bytes: 1240