// Problem: 468_B. Two Sets
// Time complexity: linear
import java.util.*;
import java.io.*;

public class Main
{
	static HashMap<Integer,Integer> hm;
	static int[] array;
	static boolean marked[];
	static int a , b ; 
	static int[] ans ; 
	
	public static void main( String args[])
	{
		Scanner sc = new Scanner(System.in);
		int n ; 
		
		n = sc.nextInt();
		a = sc.nextInt();
		b = sc.nextInt();
		
		hm = new HashMap<Integer,Integer>();
		array = new int[n];
		marked = new boolean[n];
		
		for( int i = 0 ; i < n ; ++i )
		{
			array[i] = sc.nextInt();
			hm.put( array[i] , i );
		}
		
		if( a == b)
		{
			boolean flag = true ;
			for( int i = 0 ; i < n ; ++i )
				if( !hm.containsKey( a - array[i]))
					flag = false; 
			
			if( !flag) 
				System.out.println( "NO");
			else
			{
				System.out.println("YES");
				for( int i = 0 ; i < n ; ++i)
					System.out.print("0 ");
			}
		}
		
		else
		{
			
			ans = new int[n];
			
			for( int i = 0 ; i < n ; ++i )
			if( marked[i] ) continue; 
			
			else  // hadle odd , even and single self loops
			{
				if( hm.containsKey(a - array[i]) && !hm.containsKey(b - array[i]))
				{
					propagateA(i);
				}
				
				else if( !hm.containsKey(a - array[i]) && hm.containsKey(b - array[i]))
				{
					// propagate b
					propagateB(i);
				}
				
				else if(!hm.containsKey(a - array[i]) && !hm.containsKey(b - array[i]))
				{
					System.out.println("NO");
					System.exit(0);
				}
			}
			
			
			
			for( int i = 0 ; i < n ; ++i )
				if( marked[i] ) continue; 
				
				else  // handle doule self loops , cycles
				{
						start(i);
				}
			
			System.out.println("YES");
			for( int i = 0 ; i < n; ++i)
				System.out.print(ans[i] + " ");
			System.exit(0);
		}
		
		
		
		
	}
	
	static void propagateA(int index)
	{
		
		int i = index;
		
		while( !marked[i])
		{
			
			
					if( hm.containsKey( a - array[i]) && !marked[ hm.get( a - array[i])])
					{
						marked[i] = true ; 
						ans [i] = 0 ; 
						
						
						i = hm.get( a - array[i]);
						marked[i] = true ; 
						ans [i] = 0 ; 
						
						
						if( hm.containsKey( b - array[i]) && !marked[ hm.get( b - array[i])])
						{
							i = hm.get( b - array[i]);
						}

					}
					
					else
					{
						System.out.println("NO");
						System.exit(0);
					}
				
		}
			
	}
	
	static void propagateB(int index)
	{
		
		int i = index;
		
		while( !marked[i])
		{
			
			
					if( hm.containsKey( b - array[i]) && !marked[ hm.get( b - array[i])])
					{
						marked[i] = true ; 
						ans [i] = 1 ;
						
				
						
						i = hm.get( b - array[i]);
						marked[i] = true ; 
						ans [i] = 1 ; 
						
						
						if( hm.containsKey( a - array[i]) && !marked[ hm.get( a - array[i])])
						{
							i = hm.get( a - array[i]);
						}

					}
					
					else
					{
						System.out.println("NO");
						System.exit(0);
					}
				
		}
			
	}
	
	static void start(int index)
	{
		 
		int i = index ; 
		
		while( !marked[i] )
		{
			//System.out.println( a - array[i]);
			if(!marked[ hm.get( a - array[i])])
			{
				marked[i] = true ; 
				ans [i] = 0 ; 
				
				
				
				i = hm.get( a - array[i]);
				marked[i] = true ; 
				ans [i] = 0 ; 
				
				
				i = hm.get( b - array[i]);
			

			}
			
			
		}
	}
		
}