Problem: Iahub isn't well prepared on geometry problems, but he heard that this year there will be a lot of geometry problems on the IOI selection camp. Scared, Iahub locked himself in the basement and started thinking of new problems of this kind. One of them is the following.

Iahub wants to draw n distinct segments [li, ri] on the OX axis. He can draw each segment with either red or blue. The drawing is good if and only if the following requirement is met: for each point x of the OX axis consider all the segments that contains point x; suppose, that rx red segments and bx blue segments contain point x; for each point x inequality |rx - bx| ≤ 1 must be satisfied.

A segment [l, r] contains a point x if and only if l ≤ x ≤ r.

Iahub gives you the starting and ending points of all the segments. You have to find any good drawing for him.

Input

The first line of input contains integer n (1 ≤ n ≤ 105) — the number of segments. The i-th of the next n lines contains two integers li and ri (0 ≤ li ≤ ri ≤ 109) — the borders of the i-th segment.

It's guaranteed that all the segments are distinct.

Output

If there is no good drawing for a given test, output a single integer -1. Otherwise output n integers; each integer must be 0 or 1. The i-th number denotes the color of the i-th segment (0 is red and 1 is blue).

If there are multiple good drawings you can output any of them.

Examples

Input

2
0 2
2 3


Output

0 1


Input

6
1 5
1 3
3 5
2 10
11 11
12 12


Output

0 1 0 1 0 0

Solution (in JAVA):

Solution:
import java.io.*;
import java.util.*;

import static java.util.Arrays.sort;
import static java.util.Arrays.fill;
import static java.lang.Math.*;

public class Main {
	
	public static void main(String[] args) {
		if((new File("input.txt")).exists())
			try {
				System.setIn(new FileInputStream("input.txt"));
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			}
		new Thread(null, new Runnable() {
			@Override
			public void run() {
				try {
					new Main().run();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}, "th1", 1 << 24).start();
	}
	
	BufferedReader in;
	PrintWriter out;
	StringTokenizer st = new StringTokenizer("");
	
	void run() throws IOException{
		in = new BufferedReader(new InputStreamReader(System.in));
//		in = new BufferedReader(new FileReader("input.txt"));
		out = new PrintWriter(System.out);
		solve();
		in.close();
		out.close();
	}

	
	TreeSet<Range> rs = new TreeSet<>();
	
	int color[];
	MultiList g;
	int idGen = 0;
	
	void solve() throws IOException{
		int n = nextInt();
		g = new MultiList(2 * n + 1, 4 * n + 1);
		color = new int[n * 2 + 1];
		for(int i = 0; i < n; i++){
			Range r;
			rs.add( r = new Range(idGen++, nextInt(), nextInt() + 1));
		}
		solveRanges();
		fill(color, -1);
		for(int i = 0; i < n; i++)
			if(color[i] == -1) dfs(i, 0);
		for(int i = 0; i < n; i++)
			out.print(((i != 0) ? " " : "") + color[i]);
	}
	
	private void solveRanges() {
		while(rs.size() > 1){
			Range fst = rs.pollFirst();
			Range snd = rs.pollFirst();
			if(fst.ri <= snd.le) {
				rs.add(snd);
				continue;
			}
			addEdge(fst.id, snd.id);
			Range next = new Range(idGen++, min(fst.ri, snd.ri), max(fst.ri, snd.ri));
			rs.add(next);
			if(fst.ri < snd.ri)
				addEdge(idGen - 1, fst.id);
			else
				addEdge(idGen - 1, snd.id);
		}
	}
	
	void dfs(int v, int cc) {
		if(color[v] != -1 && color[v] != cc) throw new RuntimeException();
		if(color[v] != -1) return;
		color[v] = cc;
		for(int j = g.head[v]; j != 0; j = g.next[j]) {
			int nv = g.vert[j];
			dfs(nv, cc ^ 1);
		}
	}
	
	void addEdge(int a, int b){
		g.add(a, b);
		g.add(b, a);
	}


	class MultiList {
		int[] head, vert, next;
		int cnt;
		MultiList(int h, int s){
			s++;
			head = new int[h];
			vert = new int[s];
			next = new int[s];
			cnt = 1;
		}
		void add(int h, int v){
			vert[cnt] = v;
			next[cnt] = head[h];
			head[h] = cnt++;
		}
	}
	class Range implements Comparable<Range>{
		int le, ri;
		int id;
		public Range(int id, int le, int ri) {
			super();
			this.le = le;
			this.ri = ri;
			this.id = id;
		}
		@Override
		public int compareTo(Range e) {
			return (le != e.le) ? (le - e.le) : ( (ri != e.ri) ? (ri - e.ri) : (id - e.id));
		}
		@Override
		public String toString() {
			return "[" + le + "; " + (ri - 1) + "]" + "%" + id;
		}
	}
	
	
	
	public String nextToken() throws IOException{
		while(!st.hasMoreTokens())
			st = new StringTokenizer(in.readLine());
		return st.nextToken();
	}
	public int nextInt() throws IOException{
		return Integer.parseInt(nextToken());
	}
	public long nextLong() throws IOException{
		return Long.parseLong(nextToken());
	}
	public double nextDouble() throws IOException{
		return Double.parseDouble(nextToken());
	}
}