Problem p03656 (C++)

Buggy submission (status: Time Limit Exceeded):
/*
神题
巧妙建图
不存在欧拉回路-->无解
构造欧拉回路，为每条边定向，使每个点入度=出度
利用度数相等，确保每个点子树abs=1，以此填数
*/
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 200010
using namespace std;
struct edge {
  int x, y, f, v, next;
} a[N * 3];
int n, l, p[N], S, x, du[N], q[N];
inline void add(int x, int y) {
  a[++l].x = x;
  a[l].y = y;
  a[l].f = 0;
  a[l].next = p[x];
  p[x] = l;
  du[x]++;
}
inline void dfs(int x) {
  for (int i = q[x]; i; i = a[i].next) {
    q[x] = a[i].next;
    if (!a[i].f) {
      a[i].f = a[i ^ 1].f = 1;
      dfs(a[i].y);
      a[i].v = 0;
      a[i ^ 1].v = 1;
    }
  }
}
int main() {
  scanf("%d", &n);
  l = 1;
  memset(p, 0, sizeof(p));
  S = n * 2 + 1;
  memset(du, 0, sizeof(du));
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    if (x == -1) {
      add(i, S);
      add(S, i);
    } else {
      add(i, x);
      add(x, i);
    }
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    if (x == -1) {
      add(n + i, S);
      add(S, n + i);
    } else {
      add(n + i, n + x);
      add(n + x, n + i);
    }
  }
  for (int i = 1; i <= n; i++) {
    if ((du[i] & 1) != (du[n + i] & 1)) {
      printf("IMPOSSIBLE");
      return 0;
    }
    if (du[i] & 1) {
      add(i, n + i);
      add(n + i, i);
      du[i]--;
      du[n + i]--;
    }
  }
  memcpy(q, p, sizeof(q));
  dfs(S);
  printf("POSSIBLE\n");
  for (int i = 1; i <= n; i++) {
    if (!(du[i] & 1))
      printf("0");
    else {
      for (int j = p[i]; j; j = a[j].next)
        if (a[j].y == n + i) {
          if (a[j].v)
            printf("1");
          else
            printf("-1");
        }
    }
    if (i <= n - 1)
      printf(" ");
  }
  return 0;
}

Fixed submission:
/*
神题
巧妙建图
不存在欧拉回路-->无解
构造欧拉回路，为每条边定向，使每个点入度=出度
利用度数相等，确保每个点子树abs=1，以此填数
*/
#include <algorithm>
#include <cstdio>
#include <cstring>
#define N 200010
using namespace std;
struct edge {
  int x, y, f, v, next;
} a[N * 3];
int n, l, p[N], S, x, du[N], q[N];
inline void add(int x, int y) {
  a[++l].x = x;
  a[l].y = y;
  a[l].f = 0;
  a[l].next = p[x];
  p[x] = l;
  du[x]++;
}
inline void dfs(int x) {
  for (int i = q[x]; i; i = q[x]) {
    q[x] = a[i].next;
    if (!a[i].f) {
      a[i].f = a[i ^ 1].f = 1;
      dfs(a[i].y);
      a[i].v = 0;
      a[i ^ 1].v = 1;
    }
  }
}
int main() {
  scanf("%d", &n);
  l = 1;
  memset(p, 0, sizeof(p));
  S = n * 2 + 1;
  memset(du, 0, sizeof(du));
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    if (x == -1) {
      add(i, S);
      add(S, i);
    } else {
      add(i, x);
      add(x, i);
    }
  }
  for (int i = 1; i <= n; i++) {
    scanf("%d", &x);
    if (x == -1) {
      add(n + i, S);
      add(S, n + i);
    } else {
      add(n + i, n + x);
      add(n + x, n + i);
    }
  }
  for (int i = 1; i <= n; i++) {
    if ((du[i] & 1) != (du[n + i] & 1)) {
      printf("IMPOSSIBLE");
      return 0;
    }
    if (du[i] & 1) {
      add(i, n + i);
      add(n + i, i);
      du[i]--;
      du[n + i]--;
    }
  }
  memcpy(q, p, sizeof(q));
  dfs(S);
  printf("POSSIBLE\n");
  for (int i = 1; i <= n; i++) {
    if (!(du[i] & 1))
      printf("0");
    else {
      for (int j = p[i]; j; j = a[j].next)
        if (a[j].y == n + i) {
          if (a[j].v)
            printf("1");
          else
            printf("-1");
        }
    }
    if (i <= n - 1)
      printf(" ");
  }
  return 0;
}