#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #ifdef LOCAL #include "debug.h" #else #define debug(x...) #endif //#pragma GCC optimize("Ofast") //#define int ll using namespace std; typedef long long ll; typedef long double ld; typedef pair pii; #define mp make_pair #define pb push_back #define sz(x) int((x).size()) #ifndef LOCAL mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); #else mt19937 rng(228); #endif const int N = 1e5 + 7; const int inf = INT_MAX / 2; const ll INF = LLONG_MAX / 3; const int MOD = 1e9 + 7; const double eps = 1e-6; const string cars[] = {"🚗", "🚕", "🚙"}; struct dsu { int p[N], s[N], ans[N]; vector < pii > a[N]; dsu() { iota(p, p + N, 0); memset(s, 1, sizeof s); } int find(int u) { return (p[u] == u ? u : p[u] = find(p[u])); } void add_friend(int u, int v) { if (find(u) == find(v)) { ans[u]++; ans[v]++; } else { int x = find(u); int y = find(v); a[x].push_back({ u, v }); a[y].push_back({ v, u }); } } void add_edge(int u, int v) { int x = find(u); int y = find(v); if (x != y) { vector < pii > t; for (int i = 0; i < sz(a[x]); i++) { auto [n1, n2] = a[x][i]; if (find(n2) == y) { ans[n1]++; ans[n2]++; } else { t.push_back(a[x][i]); } } for (int i = 0; i < sz(a[y]); i++) { auto [n1, n2] = a[y][i]; if (find(n2) != x) { t.push_back(a[y][i]); } } if (s[x] < s[y]) { p[x] = y; s[y] += s[x]; a[x].clear(); a[y] = t; } else { p[y] = x; s[x] += s[y]; a[y].clear(); a[x] = t; } } } } a; signed main() { #ifdef LOCAL freopen("input.txt", "r", stdin); //freopen("output.txt", "w", stdout); #endif cout << fixed << setprecision(9); ios::sync_with_stdio(false); cin.tie(); cout.tie(); int n, m, k; cin >> n >> m >> k; for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; a.add_friend(u, v); } for (int i = 0; i < k; ++i) { int u, v; cin >> u >> v; a.add_edge(u, v); } int q; cin >> q; while (q--) { char c; cin >> c; if (c == '?') { int x; cin >> x; cout << a.ans[x] << "\n"; } else { int u, v; cin >> u >> v; if (c == 'T') { a.add_edge(u, v); } else { a.add_friend(u, v); } } } return 0; }