#include using namespace std; #define rep(i, a, b) for(int i = a; i < (b); ++i) #define trav(a, x) for(auto& a : x) #define all(x) x.begin(), x.end() #define sz(x) (int)(x).size() typedef long long ll; typedef pair pii; typedef pair pll; typedef vector vi; typedef vector vl; const int MAXN = 100000; vector C(MAXN, vi()); vector C2(MAXN, vi()); int n; int ANS[MAXN] = {0}; int ans = 0; int no(int x, int y){ for(int c1 = 1; c1 <= 3; c1++){ bool yes = 1; if(c1 != x && c1 != y)return c1; } } void two_color(){ int color[MAXN] = {0}; for(int c1 = 0; c1 < n; c1++){ if(color[c1] == 0){ queue Q; color[c1] = 1; Q.push(c1); while(!Q.empty()){ int a = Q.front(); Q.pop(); trav(y, C2[a]){ if(color[y] == 0){ color[y] = -color[a]; Q.push(y); } else{ if(color[y] == color[a])return; } } } } } ans = 2; rep(c1,0,n){ ANS[c1] = (color[c1]+1)/2+1; } return; } void give(int i, int c){ if(ANS[i] == 0)ANS[i] = c; ans = max(ans, ANS[i]); } vector dfs_stack; void solve(){ int i = dfs_stack.back()[0]; int j = dfs_stack.back()[1]; int prev = dfs_stack.back()[2]; dfs_stack.pop_back(); if(i >= j)return; if(sz(C[i]) == 0){ give(i, no(prev, -1)); dfs_stack.push_back({i+1, j, -1}); } else{ int nxt = C[i].back(); give(i, no(prev, ANS[nxt])); C[i].pop_back(); dfs_stack.push_back({i, nxt, prev}); dfs_stack.push_back({nxt, j, ANS[i]}); } } int main() { cin >> n; vector employees; for(int c1 = 0; c1 < n; c1++){ int a,b; cin >> a >> b; while(a > 0){ int i = employees.back().first; C[i].push_back(c1); C2[c1].push_back(i); C2[i].push_back(c1); if(employees.back().second > a){ employees.back().second -= a; a = 0; } else{ a -= employees.back().second; employees.pop_back(); } } if(b > 0)employees.push_back({c1, b}); } dfs_stack.push_back({0, n, -1}); while(sz(dfs_stack) > 0){ solve(); } if(ans == 3)two_color(); cout << ans << "\n"; for(int c1 = 0; c1 < n; c1++){ cout << ANS[c1] << " "; } cout << "\n"; return 0; }