#include <bits/stdc++.h>
#define IOS ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define _zero(a) memset(a, 0, sizeof(a))
#define endl '\n'
#define int long long
#define mp make_pair
#define x first
#define y second
#define all(a) (a).begin(), (a).end()
#define rall(a) (a).rbegin(), (a).rend()
#define PII pair<int, int>
typedef long long ll;
typedef double dd;
typedef long double ld;
using namespace std;
const int inf = 1e10;
const int M = 998244353;
const ld pi = atan2(0, -1);//arctan(y/x);
const ld eps = 1e-4;
const int maxn = 5e4 + 1000;
int mn[maxn], mx[maxn];
int f[maxn];
bool cmp(int a, int b){
return mn[a] < mn[b];
}
signed main()
{
IOS;
int n;
cin >> n;
for(int i = 1; i <= n; i++) cin >> mn[i] >> mx[i];
priority_queue<PII, vector<PII>, greater<PII> > que;
for(int i = 1;i <= n; i++) f[i] = i;
sort(f + 1, f + 1 + n, cmp);
int cnt = 0;
vector<PII> ans;
for(int i = 1; i <= n; i++){
int xx = f[i];
if(!que.empty()){
PII top = que.top();
if(top.first < mn[xx]){
que.pop();
que.push({mx[xx], top.second});
ans.push_back({xx, top.second});
}
else{
que.push({mx[xx], ++cnt});
ans.push_back({xx, cnt});
}
}
else{
que.push({mx[xx], ++cnt});
ans.push_back({xx, cnt});
}
}
sort(all(ans));
int needmx = 0;
for(auto v : ans) needmx = max(needmx, v.second);
cout << needmx << endl;
for(auto v : ans) cout << v.second << endl;
/*for(int i = 1; i <= n; i++) que.push({mx[f[i]], ++cnt});
while(!que.empty()){
PII top = que.top();
cout << top.first << " " << top.second << endl;
que.pop();
}*/
return 0;
}