#include "bits/stdc++.h"
#include<unordered_map>
#include<unordered_set>
#pragma warning(disable:4996)
using namespace std;
using ld = long double;
template<class T>
using Table = vector<vector<T>>;

const double eps = 1e-9, pi = acos(-1.0);
//
//int main() {
//	int N, A, B, T; cin >> N >> A >> B >> T;
//	string st; cin >> st;
//	vector<long long int>times(st.size(),1);
//	for (int i = 0; i < st.size(); ++i) {
//		if (st[i] == 'w') {
//			times[i] += B;
//		}
//	}
//	if (times[0] > T) {
//		cout << 0 << endl;
//		return 0;
//	}
//	else {
//		T -= times[0];
//		{
//			if (accumulate(times.begin() + 1, times.end(), A*(N-1)) <= T) {
//				cout << N << endl;
//				return 0;
//			}
//			else {
//				vector<int>rdp,ldp;
//				{
//					rdp.push_back(0);
//					int ntime = 0;
//					for (int i = 1; i < N; ++i) {
//						ntime += A + times[i];
//						rdp.push_back(ntime);
//					}
//				}
//				{
//					ldp.push_back(0);
//					int ntime = 0;
//					for (int i = N-1; i >=1; --i) {
//						ntime += A + times[i];
//						ldp.push_back(ntime);
//					}
//				}
//				int ans = 1;
//				for (int i = 0; i < N; ++i) { 
//					int resttime = T - rdp[i]-A*i;
//					if (rdp[i] > T)break;
//					auto it = lower_bound(ldp.begin(), ldp.end(), resttime);
//					ans = max(ans, i+(it - ldp.begin()));
//				}
//				cout << ans << endl;
//			}
//		}
//	}
//	return 0;
//}
struct aqua {
	int lh;
	int rh;
	int x;
	ld pluswater;
	ld high;
	vector<int>places;
	aqua(const int _lh, const int rh_, const int x_) :lh(_lh), rh(rh_), x(x_),pluswater(0),high(0),places() {};
};

struct check {
	int id;
	int time;
	int place;
};
int main() {
	int D; cin >> D;
	while (D--) {
		int N; cin >> N;
		vector<pair<int,int>>plates;
		vector<aqua>aquas;
		for (int i = 0; i < N; ++i) {
			int B, H; cin >> B >> H;
			plates.emplace_back(B, H);
		}
		aquas.emplace_back(1e9, plates[0].second, plates[0].first);
		aquas[0].places.push_back(0);
		for (int i = 0; i < N-1; ++i) {
			aquas.emplace_back(plates[i].second, plates[i + 1].second, plates[i + 1].first - plates[i].first);
			aquas[i+1].places.push_back(i+1);
		}
		aquas.emplace_back(plates[N-1].second, 1e9, 100-plates[N-1].first);
		aquas[N].places.push_back(N);
		int M; cin >> M;
		for (int i = 0; i < M; ++i) {
			int F, A; cin >> F >> A;
			auto it = lower_bound(plates.begin(), plates.end(), make_pair(F,0));
			const int place = it - plates.begin();
			aquas[place].pluswater += A;
		}
		int L; cin >> L;
		vector<check>ps;
		for (int  i = 0; i < L; i++)
		{
			int P, T; cin >> P >> T;
			auto it = lower_bound(plates.begin(), plates.end(), make_pair(P, 0));
			const int place = it - plates.begin();
			ps.push_back(check{ i, T,place });
		}
		sort(ps.begin(), ps.end(), [](const check&l, const check&r) {return l.time < r.time; });
		auto it = ps.begin();
		vector<ld>anss(L);
		ld nowtime = 0; 
		while (it != ps.end()) {
			vector<ld>uptimes;
			for (int i = 0; i < aquas.size(); ++i) {
				if (aquas[i].pluswater < 1e-10)uptimes.push_back(1e18);
				else {
					const ld restheight = min(aquas[i].lh, aquas[i].rh) - aquas[i].high;
					uptimes.push_back(nowtime + restheight * 30 * aquas[i].x / aquas[i].pluswater);

				}
			}
			ld nexttime =  *min_element(uptimes.begin(), uptimes.end());
			for (int i = 0; i < aquas.size(); ++i) {
				aquas[i].high += (nexttime - nowtime)*aquas[i].pluswater / 30 / aquas[i].x;
			}
			while (nexttime > it->time+eps) {
				for (int i = 0; i < aquas.size(); ++i) {
					if (find(aquas[i].places.begin(), aquas[i].places.end(), it->place) != aquas[i].places.end()) {
						anss[it->id] = aquas[i].high -(nexttime - it->time)*aquas[i].pluswater / 30 / aquas[i].x;
					}
				}
				it++;
				if (it == ps.end())break;
			}
			for (int j = 0; j < 20; ++j) {
				for (int i = 0; i < aquas.size(); ++i) {
					if (aquas[i].high + eps>aquas[i].rh) {
						if (i == aquas.size()-1)continue;
						if (abs(aquas[i].high - aquas[i + 1].high) < eps) {
							aquas[i].rh = aquas[i + 1].rh;
							aquas[i].pluswater += aquas[i + 1].pluswater;
							aquas[i].x += aquas[i + 1].x;
							aquas[i].places.insert(aquas[i].places.end(), aquas[i + 1].places.begin(), aquas[i + 1].places.end());
							aquas.erase(aquas.begin() + i + 1);
							break;
						}
						else {
							aquas[i + 1].pluswater += aquas[i].pluswater;
							aquas[i].pluswater = 0;
						}
					}
					if (aquas[i].high + eps>aquas[i].lh) {
						if (!i)continue;
						if (abs(aquas[i].high - aquas[i - 1].high) < eps) {
							aquas[i].lh = aquas[i - 1].lh;
							aquas[i].pluswater += aquas[i - 1].pluswater;
							aquas[i].x += aquas[i - 1].x;
							aquas[i].places.insert(aquas[i].places.end(), aquas[i - 1].places.begin(), aquas[i - 1].places.end());
							aquas.erase(aquas.begin() + i - 1);
							break;
						}
						else {
							aquas[i - 1].pluswater += aquas[i].pluswater;
							aquas[i].pluswater = 0;
						}
					}
				}
			}
			nowtime = nexttime;
		}
		


		for (int  i = 0; i < anss.size(); i++)
		{
			cout <<fixed<<setprecision(22)<< min(50.l, anss[i]) << endl;
		}
	}
	return 0;
}

Measured memory_bytes: 3204