#include <bits/stdc++.h>   using namespace std;   namespace output {   void pr(short x) { cout << x; }   void pr(unsigned x) { cout << x; }   void pr(int x) { cout << x; }   void pr(long long x) { cout << x; }   void pr(unsigned long long x) { cout << x; }   void pr(double x) { cout << x; }   void pr(long double x) { cout << x; }   void pr(char x) { cout << x; }   void pr(const char* x) { cout << x; }   void pr(const string& x) { cout << x; }   void pr(bool x) { cout << (x ?  true  :  false ); }   template <class S, class T>   void pr(const pair<S, T>& x) {     pr(1 ?  (  :   ), pr(x.first), pr(1 ?  ,   :    ), pr(x.second),         pr(1 ?  )  :   );   }   template <class T>   void pr(const vector<T>& x) {     pr(1 ?  {  :   );     bool _ = 0;     for (const auto& v : x) pr(_ ? 1 ?  ,   :     :   ), pr(v), _ = 1;     pr(1 ?  }  :   );   }   template <class T>   void pr(const set<T>& x) {     pr(1 ?  {  :   );     bool _ = 0;     for (const auto& v : x) pr(_ ? 1 ?  ,   :     :   ), pr(v), _ = 1;     pr(1 ?  }  :   );   }   template <class T>   void pr(const multiset<T>& x) {     pr(1 ?  {  :   );     bool _ = 0;     for (const auto& v : x) pr(_ ? 1 ?  ,   :     :   ), pr(v), _ = 1;     pr(1 ?  }  :   );   }   template <class S, class T>   void pr(const map<S, T>& x) {     pr(1 ?  {  :   );     bool _ = 0;     for (const auto& v : x) pr(_ ? 1 ?  ,   :     :   ), pr(v), _ = 1;     pr(1 ?  }  :   );   }   template <class S, class... T>   void pr(const S& a, const T&... b) {     pr(a);     if (sizeof...(b))       pr(   ), pr(b...);     else       pr(  n );   }   }  // namespace output   using namespace output;   const int MN = 5e5 + 5;   long long n, m, i, ds[MN][2], sz[MN], t[MN][2], h[MN][2], lst[MN][2], x, y;   map<long long, long long> psa[MN];   char ch;   long long fnd(long long n, long long p) {     return ds[n][p] == n ? n : fnd(ds[n][p], p);   }   long long ttt(long long n, long long p) {     return ds[n][0] == n ? (lst[n][0] >= p ? lst[n][0] : 0)                          : max(lst[n][0] >= p ? lst[n][0] : 0,                                ttt(ds[n][0], max(t[n][0], p)));   }   long long qu(long long n, long long p) {     if (ds[n][1] == n) {       if (psa[n].empty()) return 0LL;       auto it = psa[n].lower_bound(p);       auto ed = psa[n].end();       ed--;       if (it == psa[n].begin())         return ed->second;       else {         it--;         return ed->second - it->second;       }     } else {       if (psa[n].empty()) return qu(ds[n][1], max(t[n][1], p));       auto it = psa[n].lower_bound(p);       auto ed = psa[n].end();       ed--;       if (it == psa[n].begin())         return ed->second + qu(ds[n][1], max(t[n][1], p));       else {         it--;         return ed->second - it->second + qu(ds[n][1], max(t[n][1], p));       }     }   }   int main() {     scanf( %lld%lld , &n, &m);     for (i = 1; i <= n; i++) {       sz[i] = 1;       ds[i][0] = ds[i][1] = i;     }     for (i = 1; i <= m; i++) {       scanf(  %c%lld , &ch, &x);       if (ch ==  U ) {         scanf( %lld , &y);         x = fnd(x, 1), y = fnd(y, 1);         if (h[x][1] < h[y][1]) swap(x, y);         if (h[x][1] == h[y][1]) h[x][1]++;         sz[x] += sz[y];         ds[y][1] = x;         t[y][1] = i;       } else if (ch ==  M ) {         scanf( %lld , &y);         x = fnd(x, 0), y = fnd(y, 0);         if (h[x][0] < h[y][0]) swap(x, y);         if (h[x][0] == h[y][0]) h[x][0]++;         ds[y][0] = x;         t[y][0] = i;       } else if (ch ==  Q ) {         long long tt = ttt(x, 0);         printf( %lld n , qu(x, tt));       } else if (ch ==  Z ) {         x = fnd(x, 0);         lst[x][0] = i;       } else if (ch ==  A ) {         x = fnd(x, 1);         long long lst = 0;         if (psa[x].size()) {           auto it = psa[x].end();           it--;           lst = it->second;         }         psa[x][i] = lst + sz[x];       }     }     return 0;   }