func_code_string: #include <bits/stdc++.h>   using namespace std;   int n, m;   struct BIT {     long long val[500005];     void add(int x, int w) {       for (; x <= m; x += x & -x) val[x] += w;       return;     }     long long sum(int x) {       long long sum = 0;       for (; x; x -= x & -x) sum += val[x];       return sum;     }     long long query(int l, int r) { return sum(r) - sum(l - 1); }   } T;   struct DSU {     int fa[500005 << 1], val[500005 << 1];     void init() {       for (int i = 1; i <= n * 2; ++i) fa[i] = i, val[i] = 1;       return;     }     int find(int x) {       if (fa[x] == x) return x;       int p = find(fa[x]);       val[x] = max(val[x], val[fa[x]]);       return fa[x] = p;     }     void merge(int x, int y) {       fa[find(x)] = find(y);       return;     }   } D;   int fa[500005], sz[500005], id[500005];   long long ans[500005];   vector<pair<int, int> > op[500005], son[500005], qu[500005];   int read();   void dfs(int);   int main() {     n = read(), m = read();     D.init();     int cnt = n;     for (int i = 1; i <= n; ++i) id[i] = i, sz[i] = 1;     for (int i = 1; i <= m; ++i) {       char ch = getchar();       int x = read(), y;       if (ch ==  U )         fa[y = read()] = x, son[x].push_back(make_pair(y, i)), sz[x] += sz[y];       if (ch ==  M ) {         y = read();         ++cnt;         D.merge(id[x], cnt);         D.merge(id[y], cnt);         id[x] = cnt;       }       if (ch ==  A ) op[x].push_back(make_pair(sz[x], i));       if (ch ==  Z ) D.val[id[x]] = i;       if (ch ==  Q ) {         D.find(x), qu[x].push_back(make_pair(i, D.val[x]));       }     }     memset(ans, -1, sizeof ans);     for (int i = 1; i <= n; ++i)       if (!fa[i]) dfs(i);     for (int i = 1; i <= m; ++i)       if (ans[i] != -1) printf( %lld n , ans[i]);     return 0;   }   int read() {     int x = 0;     char ch = getchar();     for (; !isdigit(ch); ch = getchar())       ;     for (; isdigit(ch); ch = getchar()) x = x * 10 + (ch ^ 48);     return x;   }   void dfs(int u) {     int sz1 = son[u].size(), sz2 = op[u].size(), pos = sz2 - 1;     for (int i = sz1 - 1; ~i; --i) {       int tm = son[u][i].second, v = son[u][i].first;       while (~pos && op[u][pos].second > tm)         T.add(op[u][pos].second, op[u][pos].first), --pos;       dfs(v);     }     while (~pos) T.add(op[u][pos].second, op[u][pos].first), --pos;     int sz3 = qu[u].size();     for (int i = 0; i < sz3; ++i)       ans[qu[u][i].first] = T.query(qu[u][i].second, qu[u][i].first);     for (int i = 0; i < sz2; ++i) T.add(op[u][i].second, -op[u][i].first);     return;   }   