#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;

struct node
{
	int x,y,index;
	node(int x1,int y1,int index1)
	{
		x=x1;
		y=y1;
		index=index1;
	}
};

class comp
{
	public:
	bool operator()(node*a,node*b)
	{
		return a->y > b->y;
	}
};

bool comp2(node*a,node*b)
{
	if(a->x == b->x)
	{
		return a->y < b->y;
	}
	else
	{
		return a->x < b->x;
	}
}


int main() {

	int n;
	cin>>n;
	
	int ans[n]={0};
	vector<node*> V;
	for(int i=0;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		V.push_back(new node(x,y,i));
	}

	priority_queue<node*,vector<node*>,comp> PQ;

	sort(V.begin(),V.end(),comp2);

	int roomCnt=0;
	int maxCnt=0;
	for(int i=0;i<n;i++)
	{
		if(PQ.empty() || PQ.top()->y >= V[i]->x)
		{
			roomCnt++;
			ans[V[i]->index]=roomCnt;
			PQ.push(new node(V[i]->x,V[i]->y,roomCnt));
			if(maxCnt < roomCnt)
			{
				maxCnt = roomCnt;
			}
		}
		else
		{
			node*vacant = PQ.top();
			PQ.pop();
			PQ.push(new node(V[i]->x,V[i]->y,vacant->index));
			ans[V[i]->index]=vacant->index;
		}
	}

	cout<<maxCnt<<endl;
	for(int i=0;i<n;i++)
	{
		cout<<ans[i]<<" ";
	}
	cout<<endl;

	return 0;
}