#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 50010
using namespace std;
int n,ans;
int order[M];
struct Node{
int st,en,pos;
friend bool operator < (Node x,Node y){
if(x.en==y.en)
return x.st<y.st;
else
return x.en>y.en;
}
}a[M];
priority_queue <Node> Q;
bool cmp(Node x,Node y){
if(x.st==y.st)
return x.en<y.en;
else
return x.st<y.st;
}
int main(){
while(~scanf("%d",&n)){
for(int i=1;i<=n;i++){
scanf("%d%d",&a[i].st,&a[i].en);
a[i].pos=i;
}
sort(a+1,a+n+1,cmp);
ans=1;
Q.push(a[1]);
order[a[1].pos]=1;
for(int i=2;i<=n;i++){
if(!Q.empty()&&Q.top().en<a[i].st){
order[a[i].pos]=order[Q.top().pos];
Q.pop();
}
else{
ans++;
order[a[i].pos]=ans;
}
Q.push(a[i]);
}
printf("%d\n",ans);
for(int i=1;i<=n;i++)
printf("%d\n",order[i]);
while(!Q.empty()) Q.pop();
}
return 0;
}