Problem p02749 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define SZ(x) ((int)(x).size())

typedef long long ll;

const int MAXN = 2e5 + 1;

vector<int> G[MAXN];
vector<int> side[2];
vector<int> colors[3];
int choice[MAXN];

void dfs(int u, int p, int s) {
  side[s].push_back(u);
  for (auto v : G[u])
    if (v != p)
      dfs(v, u, !s);
}

int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int N;
  cin >> N;
  for (int i(1); i < N; ++i) {
    int u, v;
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }

  dfs(1, 1, 0);
  for (int i(1); i <= N; ++i)
    colors[i % 3].push_back(i);
  if (SZ(side[0]) > SZ(side[1]))
    swap(side[0], side[1]);

  if (SZ(side[0]) <= SZ(colors[0])) {
    while (SZ(side[0]) > 0) {
      choice[side[0].back()] = colors[0].back();
      colors[0].pop_back();
      side[0].pop_back();
    }
    for (int c(0); c < 3; ++c)
      while (SZ(colors[c]) > 0) {
        choice[side[1].back()] = colors[c].back();
        side[1].pop_back();
        colors[c].pop_back();
      }
  } else {
    while (SZ(colors[1]) > 0) {
      choice[side[1].back()] = colors[1].back();
      side[1].pop_back();
      colors[1].pop_back();
    }
    while (SZ(colors[0]) > 0) {
      choice[side[1].back()] = colors[0].back();
      side[1].pop_back();
      colors[0].pop_back();
    }
    for (int c : {0, 2})
      while (SZ(colors[c]) > 0) {
        choice[side[0].back()] = colors[c].back();
        side[0].pop_back();
        colors[c].pop_back();
      }
  }

  for (int i(1); i <= N; ++i)
    cout << choice[i] << ' ';
  cout << endl;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define SZ(x) ((int)(x).size())

typedef long long ll;

const int MAXN = 2e5 + 1;

vector<int> G[MAXN];
vector<int> side[2];
vector<int> colors[3];
int choice[MAXN];

void dfs(int u, int p, int s) {
  side[s].push_back(u);
  for (auto v : G[u])
    if (v != p)
      dfs(v, u, !s);
}

int main(void) {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);

  int N;
  cin >> N;
  for (int i(1); i < N; ++i) {
    int u, v;
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }

  dfs(1, 1, 0);
  for (int i(1); i <= N; ++i)
    colors[i % 3].push_back(i);
  if (SZ(side[0]) > SZ(side[1]))
    swap(side[0], side[1]);

  if (SZ(side[0]) <= SZ(colors[0])) {
    while (SZ(side[0]) > 0) {
      choice[side[0].back()] = colors[0].back();
      colors[0].pop_back();
      side[0].pop_back();
    }
    for (int c(0); c < 3; ++c)
      while (SZ(colors[c]) > 0) {
        choice[side[1].back()] = colors[c].back();
        side[1].pop_back();
        colors[c].pop_back();
      }
  } else {
    while (SZ(colors[1]) > 0) {
      choice[side[1].back()] = colors[1].back();
      side[1].pop_back();
      colors[1].pop_back();
    }
    while (SZ(side[1]) > 0) {
      choice[side[1].back()] = colors[0].back();
      side[1].pop_back();
      colors[0].pop_back();
    }
    for (int c : {0, 2})
      while (SZ(colors[c]) > 0) {
        choice[side[0].back()] = colors[c].back();
        side[0].pop_back();
        colors[c].pop_back();
      }
  }

  for (int i(1); i <= N; ++i)
    cout << choice[i] << ' ';
  cout << endl;
}