#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
map<int, int> Td;
int n, a, b;
int p[maxn];
struct TwoSAT {
  int n;
  vector<int> G[maxn * 2];
  bool mark[maxn * 2];
  int S[maxn * 2], c;
  bool dfs(int x) {
    if (mark[x ^ 1]) return false;
    if (mark[x]) return true;
    mark[x] = true;
    S[c++] = x;
    for (int i = 0; i < G[x].size(); i++)
      if (!dfs(G[x][i])) return false;
    return true;
  }
  void init(int n) {
    this->n = n;
    for (int i = 0; i < n * 2; i++) G[i].clear();
    memset(mark, 0, sizeof(mark));
  }
  void add_clause(int x, int xval, int y, int yval) {
    x = x * 2 + xval;
    y = y * 2 + yval;
    G[x].push_back(y);
  }
  bool solve() {
    for (int i = 0; i < n * 2; i += 2)
      if (!mark[i] && !mark[i + 1]) {
        c = 0;
        if (!dfs(i)) {
          while (c > 0) mark[S[--c]] = false;
          if (!dfs(i + 1)) return false;
        }
      }
    return true;
  }
};
TwoSAT solver;
int tk[maxn];
int main() {
  scanf("%d%d%d", &n, &a, &b);
  solver.init(n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &p[i]);
    Td[p[i]] = i;
  }
  for (int i = 1; i <= n; i++) {
    int w = Td[a - p[i]];
    if (w && w != i) {
      solver.add_clause(i - 1, 0, w - 1, 0);
      solver.add_clause(i - 1, 1, w - 1, 1);
    } else if (!w)
      solver.add_clause(i - 1, 0, i - 1, 1);
    w = Td[b - p[i]];
    if (w && w != i) {
      solver.add_clause(i - 1, 0, w - 1, 0);
      solver.add_clause(i - 1, 1, w - 1, 1);
    } else if (!w)
      solver.add_clause(i - 1, 1, i - 1, 0);
  }
  bool ans = solver.solve();
  if (ans) {
    printf("YES\n");
    for (int i = 0; i < 2 * n; i += 2)
      if (solver.mark[i])
        printf("0 ");
      else
        printf("1 ");
    printf("\n");
  } else
    printf("NO\n");
  return 0;
}
