OI XXX - gra

// https://szkopul.edu.pl/problemset/problem/BefzQSkyOOBhuycp8gvD8XdG/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 500 * 1001, L = 21;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

std::vector<int> kra[sizik];
std::vector<int> cent;
int dp[sizik];
int n;
int jump[sizik][L];
int odl[sizik][2];
int depth[sizik];
int q, s[2];
int pre[sizik], post[sizik], timer = 1;

void DFS(int v, int p) {
    dp[v] = 1;
    depth[v] = depth[p] + 1;
    pre[v] = ++timer;

    jump[v][0] = p;
    for (int i = 1; i < L; i++) {
        jump[v][i] = jump[jump[v][i - 1]][i - 1];
    }

    bool isGood = true;

    for (const auto& u : kra[v]) {
        if (u != p) {
            DFS(u, v);
            dp[v] += dp[u];

            if (2 * dp[u] > n) {
                isGood = false;
            }
        }
    }

    if (2 * (n - dp[v]) > n) {
        isGood = false;
    }

    post[v] = ++timer;

    if (isGood) {
        cent.push_back(v);
    }
}

int jumper(int a, int b) {
    for (int i = 0; b > 0; i++) {
        if (b & 1) a = jump[a][i];
        b >>= 1;
    }
    return a;
}

int check(int a, int b) {
    return pre[a] <= pre[b] && post[a] >= post[b];
}

int lca(int u, int v) {
    if (check(u, v)) return u;
    if (check(v, u)) return v;
    for (int i = L - 1; i >= 0; --i) {
        if (!check(jump[u][i], v)) u = jump[u][i];
    }
    return jump[u][0];
}

int dist(int a, int b) {
    int l = lca(a, b);
    return depth[a] + depth[b] - 2 * depth[l];
}

std::set<int> czy[2];

int d[4 * sizik][2][2];
void init() {
    for (int i = 0; i <= 4 * (n + 2); i++) {
        d[i][0][0] = 0;
        d[i][0][1] = 0;
        d[i][1][0] = 0;
        d[i][1][1] = 0;
    }
}
int get(int v, int tl, int tr, int l, int r, int x, int y) {
    if (l > r) return 0;
    if (l == tl && r == tr) return d[v][x][y];
    int tm = (tl + tr) / 2;
    return get(2 * v, tl, tm, l, std::min(r, tm), x, y) + get(2 * v + 1, tm + 1, tr, std::max(tm + 1, l), r, x, y);
}
int get(int l, int r, int x, int y) {
    return get(1, 0, n, l, r, x, y);
}
void update(int v, int tl, int tr, int pos, int delta, int x, int y) {
    if (tl == tr) {
        d[v][x][y] += delta;
    } else {
        int tm = (tl + tr) / 2;
        if (pos <= tm)
            update(2 * v, tl, tm, pos, delta, x, y);
        else
            update(2 * v + 1, tm + 1, tr, pos, delta, x, y);

        d[v][x][y] = d[2 * v][x][y] + d[2 * v + 1][x][y];
    }
}
void update(int pos, int delta, int x, int y) {
    return update(1, 0, n, pos, delta, x, y);
}

int ktory(int a) {
    int x = 0;
    if (cent.size() > 1) {
        if (odl[a][0] > odl[a][1]) x = 1;
    }
    return x;
}

int oblicz(int a, int x) {
    int b1 = ktory(a);
    std::vector<int> xd{0, 1};
    if (b1 == 1) std::swap(xd[0], xd[1]);

    if (x == 0) {
        int l1 = get(odl[a][xd[0]], n, xd[0], 1);
        int l2 = get(odl[a][xd[1]], n, xd[1], 1);
        int l3 = 1;

        if (czy[1].find(a) == czy[1].end()) l3 = 0;

        return l1 + l2 - l3;
    } else {
        int l1 = get(0, odl[a][xd[0]], xd[0], 0);
        int l2 = get(0, odl[a][xd[0]] - 1, xd[1], 0);
        int l3 = 1;

        if (czy[0].find(a) == czy[0].end()) l3 = 0;

        return l1 + l2 - l3;
    }
}

void n0();

void solve() {
    std::cin >> n;

    for (int i = 0; i < n - 1; i++) {
        int a, b;
        std::cin >> a >> b;

        kra[a].push_back(b);
        kra[b].push_back(a);
    }

    DFS(1, 1);

    for (int i = 0; i < (int)cent.size(); i++) {
        for (int j = 1; j <= n; j++) {
            odl[j][i] = dist(cent[i], j);
        }
    }

    std::cin >> s[0] >> s[1] >> q;

    for (int j = 0; j < 2; j++) {
        for (int i = 0; i < s[j]; i++) {
            int a;
            std::cin >> a;

            czy[j].insert(a);
            int x = ktory(a);

            update(odl[a][x], 1, x, j);
        }
    }

    if (n == 1) {
        n0();
        return;
    }

    int ans = 0;

    for (const auto& a : czy[0]) {
        ans += oblicz(a, 0);
    }

    std::cout << ans << '\n';

    for (; q > 0; q--) {
        char z, t;
        int w;
        std::cin >> z >> t >> w;

        int x = ktory(w), y = (z == 'A' ? 0 : 1), mnoznik = (t == '+' ? 1 : -1);

        int local = oblicz(w, y);
        ans += mnoznik * local;

        if (t == '+') {
            czy[y].insert(w);
            update(odl[w][x], 1, x, y);
        } else {
            czy[y].erase(w);
            update(odl[w][x], -1, x, y);
        }

        std::cout << ans << '\n';
    }
}

int32_t main() {
#ifndef GARY_DBG
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);
#endif

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}

void n0() {
    std::cout << "0\n";
    for (; q > 0; q--) {
        char z, t;
        int w;
        std::cin >> z >> t >> w;
        std::cout << "0\n";
    }
}