import java.util.*;

public class Antti {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        ArrayList<Integer>[] graph = new ArrayList[n+1];
        ArrayList<Integer>[] back = new ArrayList[n+1];
        for (int i = 1; i <= n; i++) graph[i] = new ArrayList<Integer>();
        for (int i = 1; i <= n; i++) back[i] = new ArrayList<Integer>();
        int[][] history = new int[n][2];
        int hi = -1;
        for (int i = 1; i <= n; i++) {
            int rem = input.nextInt();
            int add = input.nextInt();
            while (rem > 0) {
                graph[i].add(history[hi][0]);
                back[history[hi][0]].add(i);
                if (rem >= history[hi][1]) {
                    rem -= history[hi][1];
                    hi--;
                } else {
                    history[hi][1] -= rem;
                    break;
                }
            }
            hi++;
            history[hi][0] = i;
            history[hi][1] = add;
        }
        int[] color = new int[n+1];
        boolean fail = false;
        for (int i = n; i >= 1; i--) {
            if (graph[i].size() == 0) {
                if (color[i] == 0) color[i] = 1;
                continue;
            }
            int first = graph[i].get(graph[i].size()-1);
            int color1 = 0, color2 = 0;
            if (color[i] != 0) {
                color1 = color[i];
                if (color[first] != 0) color2 = color[first];
                else color2 = 3-color1;
                if (color1 == color2) fail = true;
            } else {
                color2 = color[first] != 0 ? color[first] : 1;
                color1 = 3-color2;
            }
            color[i] = color1;
            for (int j = graph[i].size()-1; j >= 0; j--) {
                color[graph[i].get(j)] = color2;
            }
        }
        if (fail) {
            for (int i = 1; i <= n; i++) color[i] = 0;
        } else {
            System.out.println(2);
            for (int i = 1; i <= n; i++) System.out.print(color[i]+" ");
            System.out.println();
            return;
        }
        int[] illegal = new int[n+1];
        for (int i = n; i >= 1; i--) {
            if (graph[i].size() == 0) {
                if (color[i] == 0) color[i] = 1;
                continue;
            }
            int first = graph[i].get(graph[i].size()-1);
            int color1 = 0, color2 = 0, color3 = 0;
            if (color[i] != 0) {
                color1 = color[i];
                if (color[first] == 0) color2 = color1 == 1 ? 2 : 1;
                else color2 = color[first];
                if (color2 == illegal[first]) {
                    color2 = 6-color1-illegal[first];
                }
                if (color1 == color2) {
                    System.out.println("ERROR");
                    return;
                }
            } else {
                color2 = color[first] != 0 ? color[first] : 1;
                color1 = color2 == 1 ? 2 : 1;
            }
            color3 = 6-color1-color2;
            boolean swap = false;
            color[i] = color1;
            for (int j = graph[i].size()-1; j >= 0; j--) {
                int prev = graph[i].get(j);
                color[prev] = swap ? color3 : color2;
                for (int h = 0; h < back[prev].size(); h++) {
                    illegal[back[prev].get(h)] = color[prev];
                }
                swap = !swap;
            }
        }
        System.out.println("3");
        for (int i = 1; i <= n; i++) System.out.print(color[i]+" ");
        System.out.println();
    }
}
