#include <bits/stdc++.h>
#define ll long long int
#define endl "\n"
#define pb push_back
#define lb lower_bound
#define ub upper_bound
#define in insert
#define ump unordered_map
#define yes cout<<"Yes"<<"\n"
#define no cout<<"No"<<"\n"
const ll M = 998244353;
const ll INF = LLONG_MAX;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
using namespace std;
const int N = 2e5+10;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
ll n;cin>>n;
vector<pair<pair<ll,ll>,ll >> arr;
multiset<pair<ll,ll>> hotel;
for(ll i=0;i<n;i++) {
ll a,d;cin>>a>>d;arr.pb({{a,d}, i});
}
sort(arr.begin(), arr.end());
ll r=1;
vector<pair<ll,ll>> ans; ll ct=0;
for(auto el: arr) {
ll arrival = el.first.first;
ll dep = el.first.second;
if(hotel.empty()) {
r=1;
hotel.in({dep, r});
ans.pb({el.second, r});
r++;
} else {
auto fd=hotel.begin();
if(fd->first<arrival) {
ll room=fd->second;
hotel.erase(fd);
hotel.in({dep,room});
ans.pb({el.second, room});
} else {
hotel.in({dep, r});
ans.pb({el.second, r});
r++;
}
}
ct=max(ct,(ll)hotel.size());
}
cout<<ct<<endl;
sort(ans.begin(), ans.end());
for(auto el: ans) cout<<el.second<<" ";cout<<endl;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgbG9uZyBsb25nIGludAojZGVmaW5lIGVuZGwgIlxuIgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIGxiIGxvd2VyX2JvdW5kCiNkZWZpbmUgdWIgdXBwZXJfYm91bmQKI2RlZmluZSBpbiBpbnNlcnQKI2RlZmluZSB1bXAgdW5vcmRlcmVkX21hcAojZGVmaW5lIHllcyBjb3V0PDwiWWVzIjw8IlxuIgojZGVmaW5lIG5vIGNvdXQ8PCJObyI8PCJcbiIKY29uc3QgbGwgTSA9IDk5ODI0NDM1MzsKY29uc3QgbGwgSU5GID0gTExPTkdfTUFYOwpjb25zdCBpbnQgZHhbXSA9IHstMSwgMSwgMCwgMH07CmNvbnN0IGludCBkeVtdID0gezAsIDAsIC0xLCAxfTsKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKY29uc3QgaW50IE4gPSAyZTUrMTA7CgppbnQgbWFpbigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZSgwKTsKICAgIGxsIG47Y2luPj5uOwogICAgdmVjdG9yPHBhaXI8cGFpcjxsbCxsbD4sbGwgPj4gYXJyOwogICAgbXVsdGlzZXQ8cGFpcjxsbCxsbD4+IGhvdGVsOwogICAgZm9yKGxsIGk9MDtpPG47aSsrKSB7CiAgICAgICAgbGwgYSxkO2Npbj4+YT4+ZDthcnIucGIoe3thLGR9LCBpfSk7CiAgICB9CiAgICBzb3J0KGFyci5iZWdpbigpLCBhcnIuZW5kKCkpOwogICAgbGwgcj0xOwogICAgdmVjdG9yPHBhaXI8bGwsbGw+PiBhbnM7IGxsIGN0PTA7CiAgICBmb3IoYXV0byBlbDogYXJyKSB7CiAgICAgICAgbGwgYXJyaXZhbCA9IGVsLmZpcnN0LmZpcnN0OwogICAgICAgIGxsIGRlcCA9IGVsLmZpcnN0LnNlY29uZDsKICAgICAgICBpZihob3RlbC5lbXB0eSgpKSB7CiAgICAgICAgICAgIHI9MTsKICAgICAgICAgICAgaG90ZWwuaW4oe2RlcCwgcn0pOwogICAgICAgICAgICBhbnMucGIoe2VsLnNlY29uZCwgcn0pOwogICAgICAgICAgICByKys7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXV0byBmZD1ob3RlbC5iZWdpbigpOwogICAgICAgICAgICBpZihmZC0+Zmlyc3Q8YXJyaXZhbCkgewogICAgICAgICAgICAgICAgbGwgcm9vbT1mZC0+c2Vjb25kOwogICAgICAgICAgICAgICAgaG90ZWwuZXJhc2UoZmQpOwogICAgICAgICAgICAgICAgaG90ZWwuaW4oe2RlcCxyb29tfSk7CiAgICAgICAgICAgICAgICBhbnMucGIoe2VsLnNlY29uZCwgcm9vbX0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgaG90ZWwuaW4oe2RlcCwgcn0pOwogICAgICAgICAgICAgICAgYW5zLnBiKHtlbC5zZWNvbmQsIHJ9KTsKICAgICAgICAgICAgICAgIHIrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjdD1tYXgoY3QsKGxsKWhvdGVsLnNpemUoKSk7CiAgICB9CiAgICBjb3V0PDxjdDw8ZW5kbDsKICAgIHNvcnQoYW5zLmJlZ2luKCksIGFucy5lbmQoKSk7CiAgICBmb3IoYXV0byBlbDogYW5zKSBjb3V0PDxlbC5zZWNvbmQ8PCIgIjtjb3V0PDxlbmRsOwp9