#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;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8cXVldWU+CiNpbmNsdWRlIDxhbGdvcml0aG0+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpzdHJ1Y3Qgbm9kZQp7CglpbnQgeCx5LGluZGV4OwoJbm9kZShpbnQgeDEsaW50IHkxLGludCBpbmRleDEpCgl7CgkJeD14MTsKCQl5PXkxOwoJCWluZGV4PWluZGV4MTsKCX0KfTsKCmNsYXNzIGNvbXAKewoJcHVibGljOgoJYm9vbCBvcGVyYXRvcigpKG5vZGUqYSxub2RlKmIpCgl7CgkJcmV0dXJuIGEtPnkgPiBiLT55OwoJfQp9OwoKYm9vbCBjb21wMihub2RlKmEsbm9kZSpiKQp7CglpZihhLT54ID09IGItPngpCgl7CgkJcmV0dXJuIGEtPnkgPCBiLT55OwoJfQoJZWxzZQoJewoJCXJldHVybiBhLT54IDwgYi0+eDsKCX0KfQoKCmludCBtYWluKCkgewoKCWludCBuOwoJY2luPj5uOwoJCglpbnQgYW5zW25dPXswfTsKCXZlY3Rvcjxub2RlKj4gVjsKCWZvcihpbnQgaT0wO2k8bjtpKyspCgl7CgkJaW50IHgseTsKCQljaW4+Png+Pnk7CgkJVi5wdXNoX2JhY2sobmV3IG5vZGUoeCx5LGkpKTsKCX0KCglwcmlvcml0eV9xdWV1ZTxub2RlKix2ZWN0b3I8bm9kZSo+LGNvbXA+IFBROwoKCXNvcnQoVi5iZWdpbigpLFYuZW5kKCksY29tcDIpOwoKCWludCByb29tQ250PTA7CglpbnQgbWF4Q250PTA7Cglmb3IoaW50IGk9MDtpPG47aSsrKQoJewoJCWlmKFBRLmVtcHR5KCkgfHwgUFEudG9wKCktPnkgPj0gVltpXS0+eCkKCQl7CgkJCXJvb21DbnQrKzsKCQkJYW5zW1ZbaV0tPmluZGV4XT1yb29tQ250OwoJCQlQUS5wdXNoKG5ldyBub2RlKFZbaV0tPngsVltpXS0+eSxyb29tQ250KSk7CgkJCWlmKG1heENudCA8IHJvb21DbnQpCgkJCXsKCQkJCW1heENudCA9IHJvb21DbnQ7CgkJCX0KCQl9CgkJZWxzZQoJCXsKCQkJbm9kZSp2YWNhbnQgPSBQUS50b3AoKTsKCQkJUFEucG9wKCk7CgkJCVBRLnB1c2gobmV3IG5vZGUoVltpXS0+eCxWW2ldLT55LHZhY2FudC0+aW5kZXgpKTsKCQkJYW5zW1ZbaV0tPmluZGV4XT12YWNhbnQtPmluZGV4OwoJCX0KCX0KCgljb3V0PDxtYXhDbnQ8PGVuZGw7Cglmb3IoaW50IGk9MDtpPG47aSsrKQoJewoJCWNvdXQ8PGFuc1tpXTw8IiAiOwoJfQoJY291dDw8ZW5kbDsKCglyZXR1cm4gMDsKfQ==