#include <cstdio>
#include <cstring>
#include <limits>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
#define rep(i,n) for (int i = 0; i < (int)(n); i++)
typedef pair <int, int> PII;
const int N = 200005;
const int INF = numeric_limits <int>::max();
int n, root;
int w[N];
int tl[N], tr[N];
int fa[N];
int ch[N][2];
int ansx[N], ansy[N];
vector <int> coor;
vector <PII> query[N];

int trans(int x) {
    return lower_bound(coor.begin(), coor.end(), x) - coor.begin() + 1;
}

void add(int *t, int i, int x) {
    for ( ; i <= (int)coor.size(); i += i & -i) t[i] += x;
}

int get(int *t, int i) {
    int res = 0;
    for (; i; i -= i & -i) res += t[i];
    return res;
}

void dfs(int u, int dep = 0) {
    if (u != root)
        add(u == ch[fa[u]][1] ? tr : tl, trans(w[fa[u]]), 1);
    if (ch[u][0] != -1) {
        dfs(ch[u][0], dep + 1);
        dfs(ch[u][1], dep + 1);
    }
    rep (_, query[u].size()) {
        int w = trans(query[u][_].first);
        int id = query[u][_].second;
        if ((get(tl, w) - get(tl, w - 1)) || (get(tr, w) - get(tr, w - 1))) {
            ansx[id] = ansy[id] = -INF;
        } else {
            int small_l = get(tl, w - 1);
            int small_r = get(tr, w - 1);
            int large_l = get(tl, coor.size()) - small_l;
            int large_r = get(tr, coor.size()) - small_r;
            ansx[id] = small_r;
            ansy[id] = large_l + large_r + 3 * (small_l + small_r);
        }
    }
    if (u != root)
        add(u == ch[fa[u]][1] ? tr : tl, trans(w[fa[u]]), -1);
}

int main() {
//    freopen("input.txt", "r", stdin);
    int Tc;
    scanf("%d", &Tc);
    while (Tc--) {
        scanf("%d", &n);
        rep (i, n) {
            fa[i] = ch[i][0] = ch[i][1] = -1;
            query[i].clear();
        }
        coor.clear();
        rep (i, n) {
            scanf("%d", &w[i]);
            coor.push_back(w[i]);
        }
        int m;
        scanf("%d", &m);
        rep (i, m) {
            int u, a, b;
            scanf("%d%d%d", &u, &a, &b);
            u--; a--; b--;
            fa[a] = fa[b] = u;
            ch[u][0] = a;
            ch[u][1] = b;
        }
        scanf("%d", &m);
        rep (i, m) {
            ansx[i] = ansy[i] = 0;
            int u, w;
            scanf("%d%d", &u, &w);
            u--;
            query[u].push_back(PII(w, i));
            coor.push_back(w);
        }
        sort(coor.begin(), coor.end());
        coor.resize(unique(coor.begin(), coor.end()) - coor.begin());
        fill(tl, tl + coor.size() + 2, 0);
        fill(tr, tr + coor.size() + 2, 0);
        rep (i, n)
            if (fa[i] == -1)
                root = i;
        dfs(root);
        rep (i, m) {
            if (ansx[i] == -INF) {
                puts("0");
            } else {
                printf("%d %d\n", ansx[i], ansy[i]);
            }
        }
    }
}
