Problem p01288 (C++) — buggy submission, verdict: Runtime Error

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)
typedef long long ll;

template <int um> class UF {
public:
  vector<int> par;
  UF() {
    par = vector<int>(um, 0);
    rep(i, 0, um) par[i] = i;
  }
  int operator[](int x) {
    return par[x] == x ? x : par[x] = operator[](par[x]);
  }
  void operator()(int x, int y) {
    x = operator[](x);
    y = operator[](y);
    if (x != y)
      par[x] = y;
  }
};

int N, Q;
vector<int> E[101010];
int P[101010];

char O[101010];
int V[101010];

int marked[101010];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  while (cin >> N >> Q) {
    if (N == 0)
      return 0;

    rep(i, 0, N) E[i].clear();
    rep(i, 0, N) marked[i] = 0;

    P[0] = -1;
    rep(i, 1, N) {
      int p;
      cin >> p;
      p--;
      P[i] = p;
      E[i].push_back(p);
      E[p].push_back(i);
    }

    marked[0] = 1;
    rep(i, 0, Q) {
      cin >> O[i] >> V[i];
      V[i]--;
      if (O[i] == 'M')
        marked[V[i]]++;
    }

    UF<101010> uf;
    rep(i, 0, N) if (marked[i] == 0) uf(i, P[i]);

    // rep(i, 0, N) cout << uf[i] << endl;

    ll ans = 0;
    rrep(i, Q - 1, 0) {
      int v = V[i];
      if (O[i] == 'M') {
        marked[v]--;
        if (marked[v] == 0)
          uf(v, P[v]);
      } else {
        ans += (ll)uf[v] + 1LL;
      }
    }
    cout << ans << endl;
  }
}

Error: 0

Fixed submission:

#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for (int i = a; i < b; i++)
#define rrep(i, a, b) for (int i = a; i >= b; i--)

template <int um> class UF {
public:
  vector<int> par, rank;
  UF() {
    rank = vector<int>(um, 0);
    for (int i = 0; i < um; i++)
      par.push_back(i);
  }
  int operator[](int x) {
    return (par[x] == x) ? (x) : (par[x] = operator[](par[x]));
  }
  int operator()(int x, int y) {
    if ((x = operator[](x)) == (y = operator[](y)))
      return x;
    if (rank[x] < rank[y])
      return par[x] = y;
    rank[x] += rank[x] == rank[y];
    return par[y] = x;
  }
};

int N, Q;
vector<int> E[101010];
int P[101010];

char O[101010];
int V[101010];

bool marked[101010];

int main() {
  cin.tie(0);
  ios::sync_with_stdio(false);

  while (cin >> N >> Q) {
    if (N == 0)
      return 0;

    rep(i, 0, N) E[i].clear();
    rep(i, 0, N) marked[i] = false;

    P[0] = -1;
    rep(i, 1, N) {
      int p;
      cin >> p;
      p--;
      P[i] = p;
      E[i].push_back(p);
      E[p].push_back(i);
    }

    marked[0] = true;
    rep(i, 0, Q) {
      cin >> O[i] >> V[i];
      V[i]--;
      if (O[i] == 'M')
        marked[V[i]] = true;
    }

    UF<101010> uf;
    rep(i, 0, Q) if (marked[i]) {
      queue<int> que;
      que.push(i);
      while (!que.empty()) {
        int q = que.front();
        que.pop();
        uf(i, q);

        for (int to : E[q])
          if (to != P[q])
            if (!marked[to]) {
              que.push(to);
            }
      }
    }

    // rep(i, 0, N) cout << uf[i] << endl;

    int ans = 0;
    rrep(i, Q - 1, 0) {
      if (O[i] == 'M') {
        uf(V[i], P[V[i]]);
      } else {
        ans += uf[V[i]];
        // cout << uf[V[i]];
      }
    }
    cout << ans << endl;
  }
}