Problem p02749 (C++)

Buggy submission (status: Runtime Error):
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
#define N 100010
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + c - '0';
    c = getchar();
  }
  return x * f;
}
int n, a[N], dep[N], cnt0, cnt1, res1, res2;
vector<int> vec[N], G[N];
void dfs(int u, int fa) {
  dep[u] = dep[fa] + 1;
  vec[dep[u]].push_back(u);
  for (auto v : G[u]) {
    if (v == fa)
      continue;
    dfs(v, u);
  }
}
int main() {
  n = read();
  for (int i = 1; i < n; ++i) {
    int u = read(), v = read();
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(1, 0);
  for (int i = 1; i <= n; ++i) {
    if (i & 1)
      cnt1 += vec[i].size();
    else
      cnt0 += vec[i].size();
  }
  res1 = n / 3 + (n % 3 >= 1), res2 = n / 3 + (n % 3 >= 2);
  if (max(cnt1, cnt0) >= res1 && min(cnt0, cnt1) >= res2) {
    for (int i = 1; i <= n; ++i) {
      if ((i & 1) ^ (cnt1 <= cnt0)) {
        for (auto u : vec[i]) {
          if (!res1)
            break;
          --res1;
          a[u] = res1 * 3 + 1;
        }
      } else {
        for (auto u : vec[i]) {
          if (!res2)
            break;
          --res2;
          a[u] = res2 * 3 + 2;
        }
      }
    }
  } else {
    for (int i = 1 + (cnt1 < cnt0); i <= n; i += 2) {
      for (auto u : vec[i]) {
        if (res1) {
          --res1;
          a[u] = res1 * 3 + 1;
        } else if (res2) {
          --res2;
          a[u] = res2 * 3 + 2;
        }
      }
    }
  }
  int now = 1;
  for (int i = 1; i <= n; ++i) {
    if (!a[i]) {
      a[i] = now * 3;
      ++now;
    }
  }
  for (int i = 1; i <= n; ++i) {
    printf("%d ", a[i]);
  }
  printf("\n");
  return 0;
}


Fixed submission:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <vector>
using namespace std;
#define N 200010
inline int read() {
  int x = 0, f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + c - '0';
    c = getchar();
  }
  return x * f;
}
int n, a[N], dep[N], cnt0, cnt1, res1, res2;
vector<int> vec[N], G[N];
void dfs(int u, int fa) {
  dep[u] = dep[fa] + 1;
  vec[dep[u]].push_back(u);
  for (auto v : G[u]) {
    if (v == fa)
      continue;
    dfs(v, u);
  }
}
int main() {
  n = read();
  for (int i = 1; i < n; ++i) {
    int u = read(), v = read();
    G[u].push_back(v);
    G[v].push_back(u);
  }
  dfs(1, 0);
  for (int i = 1; i <= n; ++i) {
    if (i & 1)
      cnt1 += vec[i].size();
    else
      cnt0 += vec[i].size();
  }
  res1 = n / 3 + (n % 3 >= 1), res2 = n / 3 + (n % 3 >= 2);
  if (max(cnt1, cnt0) >= res1 && min(cnt0, cnt1) >= res2) {
    for (int i = 1; i <= n; ++i) {
      if ((i & 1) ^ (cnt1 <= cnt0)) {
        for (auto u : vec[i]) {
          if (!res1)
            break;
          --res1;
          a[u] = res1 * 3 + 1;
        }
      } else {
        for (auto u : vec[i]) {
          if (!res2)
            break;
          --res2;
          a[u] = res2 * 3 + 2;
        }
      }
    }
  } else {
    for (int i = 1 + (cnt1 < cnt0); i <= n; i += 2) {
      for (auto u : vec[i]) {
        if (res1) {
          --res1;
          a[u] = res1 * 3 + 1;
        } else if (res2) {
          --res2;
          a[u] = res2 * 3 + 2;
        }
      }
    }
  }
  int now = 1;
  for (int i = 1; i <= n; ++i) {
    if (!a[i]) {
      a[i] = now * 3;
      ++now;
    }
  }
  for (int i = 1; i <= n; ++i) {
    printf("%d ", a[i]);
  }
  printf("\n");
  return 0;
}