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

#include <iostream>
#include <queue>
#include <stack>
#include <vector>
using namespace std;

// 并?集相?数据与算法
#define MAX_N 100000 + 16
int parent[MAX_N];
int height[MAX_N];

void init(const int &n) {
  for (int i = 0; i < n; ++i) {
    parent[i] = i;
    height[i] = 0;
  }
}

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

void unite(int x, int y) {
  x = find(x);
  y = find(y);
  if (x == y) {
    return;
  }

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

bool same(const int &x, const int &y) { return find(x) == find(y); }
// End Of 并?集

// 原始的?用它来描述
vector<int> children[MAX_N];
int parent_tree[MAX_N];
bool marked[MAX_N];
int ancestor[MAX_N];
// ?条指令被拆分? 操作 + 目?
stack<char> operation;
stack<int> target;

void bfs(int index, int the_ancestor) {
  queue<int> q_index;
  queue<int> q_ancestor;
  q_index.push(index);
  q_ancestor.push(the_ancestor);
  while (!q_index.empty()) {
    the_ancestor = q_ancestor.front();
    q_ancestor.pop();
    index = q_index.front();
    q_index.pop();
    if (marked[index] == true) {
      the_ancestor = index;
    }
    ancestor[index] = the_ancestor;
    for (vector<int>::iterator it = children[index].begin();
         it != children[index].end(); ++it) {
      q_index.push(*it);
      q_ancestor.push(the_ancestor);
    }
  }
}

int main(int argc, char *argv[]) {

  int N, Q;
  while (cin >> N, cin >> Q, N) {
    for (int i = 0; i < N; ++i) {
      children[i].clear();
      marked[i] = false;
    }
    marked[0] = true;
    int p;
    for (int i = 1; i < N; ++i) {
      cin >> p;
      --p;
      parent_tree[i] = p;
      children[p].push_back(i);
    }
    for (int i = 0; i < Q; ++i) {
      char o;
      int t;
      cin >> o >> t;
      --t;
      if (o == 'M') {
        if (marked[t]) {
          continue;
        } else {
          marked[t] = true;
        }
      }
      operation.push(o);
      target.push(t);
    }
    bfs(0, 0);
    init(N);
    for (int i = 0; i < N; ++i) {
      unite(i, ancestor[i]);
    }
    unsigned long long result = 0;
    while (!operation.empty()) {
      char o = operation.top();
      operation.pop();
      int t = target.top();
      target.pop();
      if (o == 'Q') {
        result += ancestor[find(t)] + 1; // ?目index从1?始
      } else {
        // ?行“反染色”操作，之后?个?点的祖先??其父?点的祖先
        int p = ancestor[find(parent_tree[t])];
        unite(t, parent_tree[t]);
        ancestor[find(t)] = p;
      }
    }
    cout << result << endl;
  }

  return 0;
}

Error: -11

Fixed submission:

#include <iostream>
#include <stdio.h>
using namespace std;

int f[100010], sum[100010], v[100010];

int father(int x) {
  if (f[x] == x)
    return x;
  if (sum[x] == sum[f[x]])
    return f[x];
  f[x] = father(v[x]);
  sum[x] = sum[f[x]];
  return f[x];
}

int main() {
  int t, n, m, i, x;
  char op;
  while (scanf("%d%d", &n, &m), n) {
    f[1] = 1;
    sum[1] = 0;
    for (i = 2; i <= n; i++) {
      scanf("%d%d", &x);
      v[i] = x;
      f[i] = 1;
      sum[i] = 0;
    }
    int s = 0;
    for (i = 0; i < m; i++) {
      getchar();
      scanf("%c%d", &op, &x);
      if (op == 'M') {
        sum[father(x)]++;
        f[x] = x;
      } else
        s += father(x);
    }
    cout << s << endl;
  }
  return 0;
}