1 #include<cstdio>
2 #include<cstdlib>
3 #include<cstring>
4 #include<iostream>
5 #include<algorithm>
6 using namespace std;
7 #define Maxn 210
8 #define INF 0xfffffff
9
10 int n,p;
11 int mymax(int x,int y) {return x>y?x:y;}
12 int mymin(int x,int y) {return x<y?x:y;}
13
14 int s[Maxn],t[Maxn],num[2*Maxn][2*Maxn];
15 int pre[2*Maxn][2*Maxn],suf[2*Maxn][2*Maxn],f[2*Maxn][2*Maxn];
16
17 struct node {int x,y;}a[2*Maxn];
18 bool cmp(node x,node y) {return x.x<y.x;}
19
20 void init()
21 {
22 scanf("%d",&n);
23 for(int i=1;i<=n;i++)
24 {
25 scanf("%d%d",&s[i],&t[i]);
26 t[i]+=s[i];
27 a[i*2-1].x=s[i];a[i*2-1].y=i;
28 a[i*2].x=t[i];a[i*2].y=-i;
29 }
30 sort(a+1,a+1+n*2,cmp);
31 p=0;
32 for(int i=1;i<=n*2;i++)
33 {
34 if(i==1||a[i].x!=a[i-1].x) p++;
35 if(a[i].y>0) s[a[i].y]=p;
36 else t[-a[i].y]=p;
37 }
38 memset(num,0,sizeof(num));
39 memset(pre,0,sizeof(pre));
40 memset(suf,0,sizeof(suf));
41 for(int i=1;i<=p;i++)
42 for(int j=i;j<=p;j++)
43 for(int k=1;k<=n;k++) if(s[k]>=i&&t[k]<=j) num[i][j]++;
44
45 for(int i=1;i<=p;i++)
46 for(int j=0;j<=n;j++)
47 for(int k=1;k<=i;k++)
48 {
49 if(j>num[1][i]) {pre[i][j]=-INF;continue;}
50 pre[i][j]=mymax(pre[i][j],pre[k][j]+num[k][i]);
51 if(j>=num[k][i]) pre[i][j]=mymax(pre[i][j],pre[k][j-num[k][i]]);
52 }//printf("\n");
53 for(int i=p;i>=1;i--)
54 for(int j=0;j<=n;j++)
55 for(int k=i;k<=p;k++)
56 {
57 if(j>num[i][p]) {suf[i][j]=-INF;continue;}
58 suf[i][j]=mymax(suf[i][j],suf[k][j]+num[i][k]);
59 if(j>=num[i][k]) suf[i][j]=mymax(suf[i][j],suf[k][j-num[i][k]]);
60 }
61 }
62
63 int main()
64 {
65 init();
66
67 int ans=0;
68 for(int i=1;i<=p;i++)
69 for(int j=i;j<=p;j++)
70 {
71 int y=num[j][p];
72 for(int x=0;x<=num[1][i];x++)
73 {
74 int id;
75 for(;y>=0;y--)
76 {
77 int nw=mymin(x+y,pre[i][x]+num[i][j]+suf[j][y]);
78 if(f[i][j]<=nw)
79 {
80 f[i][j]=nw;
81 id=y;
82 }
83 else break;
84 }
85 y=id;
86 }
87 ans=mymax(ans,f[i][j]);
88 }
89
90
91 for(int i=1;i<=p;i++)
92 for(int j=p;j>=i;j--) f[i][j]=mymax(f[i][j],f[i][j+1]);
93 for(int i=1;i<=p;i++)
94 for(int j=i;j<=p;j++) f[i][j]=mymax(f[i][j],f[i-1][j]);
95 printf("%d\n",ans);
96 for(int i=1;i<=n;i++)
97 printf("%d\n",f[s[i]][t[i]]);
98
99 return 0;
100 }