func_code_string: #include <bits/stdc++.h>   using namespace std;   template <class T>   bool ckmax(T& x, T y) {     return x < y ? x = y, 1 : 0;   }   template <class T>   bool ckmin(T& x, T y) {     return x > y ? x = y, 1 : 0;   }   inline int read() {     int x = 0, f = 1;     char ch = getchar();     while (!isdigit(ch)) {       if (ch ==  - ) f = 0;       ch = getchar();     }     while (isdigit(ch)) x = x * 10 + ch -  0 , ch = getchar();     return f ? x : -x;   }   inline char rdopt() {     char ch = getchar();     while (!isalpha(ch)) ch = getchar();     return ch;   }   const int N = 1 << 20;   int n, m, t1, t2, nq, pre[N];   long long tr[N], ans[N];   vector<int> e1[N], e2[N], u2[N];   vector<pair<int, int> > u1[N], q[N];   struct dsu {     int F[N], siz[N];     inline void init(const int& n = N - 1) {       for (int i = 1, iend = n; i <= iend; ++i) F[i] = i, siz[i] = 1;     }     inline int anc(int x) { return x == F[x] ? x : F[x] = anc(F[x]); }   } d1, d2;   inline void add(int x, long long d) {     for (int i = x; i <= m; i += i & -i) tr[i] += d;   }   inline long long ask(int x) {     long long res = 0;     for (int i = x; i > 0; i -= i & -i) res += tr[i];     return res;   }   inline int query(int tim) {     int res = 0, lim = ask(tim);     for (int i = 19; i >= 0; --i)       if (res + (1 << i) <= m && tr[res + (1 << i)] < lim)         res += 1 << i, lim -= tr[res];     return res;   }   void dfs2(int u) {     for (int i : u2[u]) add(i, 1);     for (pair<int, int> i : q[u]) pre[i.second] = query(i.first);     for (int v : e2[u]) dfs2(v);     for (int i : u2[u]) add(i, -1);   }   void dfs1(int u) {     for (pair<int, int> i : u1[u]) add(i.first, i.second);     for (pair<int, int> i : q[u])       ans[i.second] = ask(i.first) - ask(pre[i.second]);     for (int v : e1[u]) dfs1(v);     for (pair<int, int> i : u1[u]) add(i.first, -i.second);   }   signed main() {     n = read(), m = read();     d1.init(n), d2.init(n), t1 = t2 = n;     for (int i = 1; i <= m; ++i) {       char op = rdopt();       if (op ==  U ) {         int x = read(), y = read(), fx = d1.anc(x), fy = d1.anc(y);         ++t1, d1.F[fx] = d1.F[fy] = d1.F[t1] = t1,               d1.siz[t1] = d1.siz[fx] + d1.siz[fy];         e1[t1].push_back(fx), e1[t1].push_back(fy);       } else if (op ==  M ) {         int x = read(), y = read(), fx = d2.anc(x), fy = d2.anc(y);         ++t2, d2.F[fx] = d2.F[fy] = d2.F[t2] = t2;         e2[t2].push_back(fx), e2[t2].push_back(fy);       } else if (op ==  A ) {         int x = read(), fx = d1.anc(x);         u1[fx].push_back(make_pair(i, d1.siz[fx]));       } else if (op ==  Z ) {         int x = read(), fx = d2.anc(x);         u2[fx].push_back(i);       } else if (op ==  Q ) {         int x = read();         q[x].push_back(make_pair(i, ++nq));       }     }     for (int i = 1, iend = t2; i <= iend; ++i)       if (d2.F[i] == i) dfs2(i);     for (int i = 1, iend = t1; i <= iend; ++i)       if (d1.F[i] == i) dfs1(i);     for (int i = 1; i <= nq; ++i) printf( %lld n , ans[i]);     return 0;   }   