Problem p02749 (C++)

Buggy submission (status: Runtime Error):
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 5;

struct Edge {
  int next, to;
} e[MAXN << 1];
int head[MAXN], etot = 0;
inline void add(int u, int v) {
  e[++etot] = (Edge){head[u], v};
  head[u] = etot;
}

int clr[MAXN], ccnt[3];
void dfs(int u, int fa) {
  ++ccnt[clr[u]];
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].to;
    if (v == fa)
      continue;
    clr[v] = !clr[u];
    dfs(v, u);
  }
}

queue<int> q[4];

int main(void) {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }

  dfs(1, 0);

  for (int i = 1; i <= n; ++i)
    q[i % 3].push(i);
  int c1 = q[1].size();
  int c2 = q[2].size();

  if (c1 <= ccnt[0] && c2 <= ccnt[1])
    for (int i = 1; i <= n; ++i) {
      int x = clr[i] + 1;
      if (q[x].empty())
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else if (c1 <= ccnt[0] && c2 <= ccnt[0])
    for (int i = 1; i <= n; ++i) {
      int x = (!clr[i]) + 1;
      if (q[x].empty())
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else if (c1 + c2 <= ccnt[0])
    for (int i = 1; i <= n; ++i) {
      int x;
      if (clr[i])
        x = 0;
      else if (!q[1].empty())
        x = 1;
      else if (!q[2].empty())
        x = 2;
      else
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else if (c1 + c2 <= ccnt[1])
    for (int i = 1; i <= n; ++i) {
      int x;
      if (!clr[i])
        x = 0;
      else if (!q[1].empty())
        x = 1;
      else if (!q[2].empty())
        x = 2;
      else
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else
    printf("-1");
  return 0;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <queue>
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 5;

struct Edge {
  int next, to;
} e[MAXN << 1];
int head[MAXN], etot = 0;
inline void add(int u, int v) {
  e[++etot] = (Edge){head[u], v};
  head[u] = etot;
}

int clr[MAXN], ccnt[3];
void dfs(int u, int fa) {
  ++ccnt[clr[u]];
  for (int i = head[u]; i; i = e[i].next) {
    int v = e[i].to;
    if (v == fa)
      continue;
    clr[v] = !clr[u];
    dfs(v, u);
  }
}

queue<int> q[4];

int main(void) {
  int n;
  scanf("%d", &n);
  for (int i = 1; i < n; ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    add(u, v);
    add(v, u);
  }

  dfs(1, 0);

  for (int i = 1; i <= n; ++i)
    q[i % 3].push(i);
  int c1 = q[1].size();
  int c2 = q[2].size();

  if (c1 <= ccnt[0] && c2 <= ccnt[1])
    for (int i = 1; i <= n; ++i) {
      int x = clr[i] + 1;
      if (q[x].empty())
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else if (c1 <= ccnt[1] && c2 <= ccnt[0])
    for (int i = 1; i <= n; ++i) {
      int x = (!clr[i]) + 1;
      if (q[x].empty())
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else if (c1 + c2 <= ccnt[0])
    for (int i = 1; i <= n; ++i) {
      int x;
      if (clr[i])
        x = 0;
      else if (!q[1].empty())
        x = 1;
      else if (!q[2].empty())
        x = 2;
      else
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else if (c1 + c2 <= ccnt[1])
    for (int i = 1; i <= n; ++i) {
      int x;
      if (!clr[i])
        x = 0;
      else if (!q[1].empty())
        x = 1;
      else if (!q[2].empty())
        x = 2;
      else
        x = 0;
      printf("%d ", q[x].front());
      q[x].pop();
    }
  else
    printf("-1");
  return 0;
}