#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;
}
