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

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;
using namespace placeholders;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
typedef vector<string> VS;
typedef stringstream SS;
typedef pair<int, int> PII;
typedef vector<pair<int, int>> VPII;
#define VT(T) vector<T>
#define VVT(T) vector<vector<T>>
#define LIM(T) numeric_limits<T>

template <typename T> inline istream &operator>>(istream &s, vector<T> &v) {
  for (T &t : v) {
    s >> t;
  }
  return s;
}
template <typename T>
inline ostream &operator<<(ostream &s, const vector<T> &v) {
  for (int i = 0; i < int(v.size()); ++i) {
    s << (" " + !i) << v[i];
  }
  return s;
}
template <typename T> inline T fromString(const string &s) {
  T res;
  istringstream iss(s);
  iss >> res;
  return res;
};
template <typename T> inline string toString(const T &a) {
  ostringstream oss;
  oss << a;
  return oss.str();
};

#define REP2(i, n) REP3(i, 0, n)
#define REP3(i, m, n) for (int i = (int)(m); i < (int)(n); ++i)
#define GET_REP(a, b, c, F, ...) F
#define REP(...) GET_REP(__VA_ARGS__, REP3, REP2)(__VA_ARGS__)
#define FOR(e, c) for (auto &e : c)
#define ALL(c) (c).begin(), (c).end()
#define AALL(a, t) (t *)a, (t *)a + sizeof(a) / sizeof(t)
#define DRANGE(c, p) (c).begin(), (c).begin() + p, (c).end()

#define SZ(v) ((int)(v).size())
#define PB push_back
#define EM emplace
#define EB emplace_back
#define BI back_inserter

#define EXIST(c, e) ((c).find(e) != (c).end())

#define MP make_pair
#define fst first
#define snd second

#define DUMP(x) cerr << #x << " = " << (x) << endl

class UnionFind {
private:
  const int N;

  vector<int> parent;
  vector<int> rank;

  int groups_;
  std::vector<int> sizes;

public:
  UnionFind(int n) : N(n), parent(N), rank(N, 0), groups_(N), sizes(N, 1) {
    std::iota(parent.begin(), parent.end(), 0);

    return;
  }

  int find(int x) {
    if (parent[x] == x) {
      return x;
    }
    return parent[x] = find(parent[x]);
  }

  bool same(int x, int y) { return find(x) == find(y); }

  bool unite(int x, int y) {
    x = find(x);
    y = find(y);

    if (x == y) {
      return false;
    }

    if (rank[x] < rank[y]) {
      parent[x] = y;
      sizes[y] += sizes[x];
    } else {
      parent[y] = x;
      sizes[x] += sizes[y];

      if (rank[x] == rank[y]) {
        ++rank[x];
      }
    }

    --groups_;
    return true;
  }

  int groups() const { return groups_; }

  int groupSize(const int x) { return sizes[find(x)]; }
};
// UnionFind( N )
// find( x )
// same( x, y )
// unite( x, y )
// groups()
// groupSize( x )

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

  for (int N, Q; scanf("%d%d", &N, &Q), (N | Q);) {
    VI parents(N, -1);
    REP(i, 1, N) {
      scanf("%d", &parents[i]);
      --parents[i];
    }
    VT(char) types(Q);
    VI vs(Q);
    REP(i, Q) {
      scanf(" %c%d", &types[i], &vs[i]);
      --vs[i];
    }
    // end of input

    VI marked(N);
    marked[0] = 1;
    REP(i, Q) {
      if (types[i] == 'M') {
        ++marked[vs[i]];
      }
    }
    REP(i, N) {
      if (!marked[i]) {
        types.PB('M');
        vs.PB(i);
        ++marked[i];
      }
    }

    VI answers(N);
    iota(ALL(answers), 1);
    UnionFind uf(N);
    LL res = 0;
    for (int i = SZ(types) - 1; 0 <= i; --i) {
      const char T = types[i];
      const int v = vs[i];

      if (T == 'M') {
        --marked[v];
        if (!marked[v]) {
          const int p = parents[v];
          const int na = answers[uf.find(p)];
          uf.unite(v, p);
          answers[uf.find(v)] = na;
        }
      } else {
        res += answers[uf.find(v)];
      }
    }

    printf("%lld\\n", res);
  }

  return 0;
}

Error: 0

Fixed submission:

#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstdio>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>

using namespace std;
using namespace placeholders;

typedef long long LL;
typedef unsigned long long ULL;
typedef vector<int> VI;
typedef vector<vector<int>> VVI;
typedef vector<string> VS;
typedef stringstream SS;
typedef pair<int, int> PII;
typedef vector<pair<int, int>> VPII;
#define VT(T) vector<T>
#define VVT(T) vector<vector<T>>
#define LIM(T) numeric_limits<T>

template <typename T> inline istream &operator>>(istream &s, vector<T> &v) {
  for (T &t : v) {
    s >> t;
  }
  return s;
}
template <typename T>
inline ostream &operator<<(ostream &s, const vector<T> &v) {
  for (int i = 0; i < int(v.size()); ++i) {
    s << (" " + !i) << v[i];
  }
  return s;
}
template <typename T> inline T fromString(const string &s) {
  T res;
  istringstream iss(s);
  iss >> res;
  return res;
};
template <typename T> inline string toString(const T &a) {
  ostringstream oss;
  oss << a;
  return oss.str();
};

#define REP2(i, n) REP3(i, 0, n)
#define REP3(i, m, n) for (int i = (int)(m); i < (int)(n); ++i)
#define GET_REP(a, b, c, F, ...) F
#define REP(...) GET_REP(__VA_ARGS__, REP3, REP2)(__VA_ARGS__)
#define FOR(e, c) for (auto &e : c)
#define ALL(c) (c).begin(), (c).end()
#define AALL(a, t) (t *)a, (t *)a + sizeof(a) / sizeof(t)
#define DRANGE(c, p) (c).begin(), (c).begin() + p, (c).end()

#define SZ(v) ((int)(v).size())
#define PB push_back
#define EM emplace
#define EB emplace_back
#define BI back_inserter

#define EXIST(c, e) ((c).find(e) != (c).end())

#define MP make_pair
#define fst first
#define snd second

#define DUMP(x) cerr << #x << " = " << (x) << endl

class UnionFind {
private:
  const int N;

  vector<int> parent;
  vector<int> rank;

  int groups_;
  std::vector<int> sizes;

public:
  UnionFind(int n) : N(n), parent(N), rank(N, 0), groups_(N), sizes(N, 1) {
    std::iota(parent.begin(), parent.end(), 0);

    return;
  }

  int find(int x) {
    if (parent[x] == x) {
      return x;
    }
    return parent[x] = find(parent[x]);
  }

  bool same(int x, int y) { return find(x) == find(y); }

  bool unite(int x, int y) {
    x = find(x);
    y = find(y);

    if (x == y) {
      return false;
    }

    if (rank[x] < rank[y]) {
      parent[x] = y;
      sizes[y] += sizes[x];
    } else {
      parent[y] = x;
      sizes[x] += sizes[y];

      if (rank[x] == rank[y]) {
        ++rank[x];
      }
    }

    --groups_;
    return true;
  }

  int groups() const { return groups_; }

  int groupSize(const int x) { return sizes[find(x)]; }
};
// UnionFind( N )
// find( x )
// same( x, y )
// unite( x, y )
// groups()
// groupSize( x )

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

  for (int N, Q; scanf("%d%d", &N, &Q) && (N | Q);) {
    VI parents(N, -1);
    REP(i, 1, N) {
      scanf("%d", &parents[i]);
      --parents[i];
    }
    VT(char) types(Q);
    VI vs(Q);
    REP(i, Q) {
      scanf(" %c%d", &types[i], &vs[i]);
      --vs[i];
    }
    // end of input

    VI marked(N);
    marked[0] = 1;
    REP(i, Q) {
      if (types[i] == 'M') {
        marked[vs[i]] = 1;
      }
    }
    REP(i, N) {
      if (marked[i]) {
        continue;
      }
      types.PB('M');
      vs.PB(i);
    }

    VI answers(N);
    iota(ALL(answers), 1);
    UnionFind uf(N);
    LL res = 0;
    for (int i = SZ(types) - 1; 0 <= i; --i) {
      const char T = types[i];
      const int v = vs[i];

      if (T == 'M') {
        const int na = answers[parents[v]];
        uf.unite(v, parents[v]);
        answers[uf.find(v)] = na;
      } else {
        res += answers[uf.find(v)];
      }
    }

    printf("%lld\\n", res);
  }

  return 0;
}