package com.netease.yunyin;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Scanner;
import java.util.Set;
public class Friend {
public static void main(String[] args) {
//获得输入
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
//存储所有的朋友圈
List<Set<Integer>>list=new ArrayList<>();
try {
//获得行数
int len=Integer.parseInt(br.readLine());
//循环
while(len-->0){
//获得每行的整数
String string=br.readLine();
if(string==null||"".equals(string))break;
String[] strings = string.split("\\s");
int a[]=new int[]{Integer.parseInt(strings[0]),
Integer.parseInt(strings[1])};
/*count
* 进行判断:
* 0 :带表集合中没有这一对好友中的任意一个,新建set集合
* 1 :代表只有一个与该对好友组成好友关系,
* 2 :代表有两个集合,与该对好友构成关系,将两个集合合成一个
* 不会大雨2
*/
int count=0;
//索引:存储list中的索引,该索引对应的集合与该对好友存在关系
int index[]=new int[2];
//索引计数
int n=0;
//遍历存在的朋友圈
for(Set<Integer>s:list){
//判断关系
if(s.contains(a[0])||s.contains(a[1]))
{
//有关系则加入
s.add(a[0]);
s.add(a[1]);
//保存索引
index[count++]=n;
}
n++;
//为2的话即可以跳出循环
if(count==2)break;
}
//不存在关系,则新建集合
if(count==0)
{
Set<Integer>s=new HashSet<>();
s.add(a[0]);
s.add(a[1]);
list.add(s);
}
//存在两个,则合并
else if(count==2){
Set<Integer> set1 = list.get(index[0]);
Set<Integer> set2 = list.get(index[1]);
set1.addAll(set2);
list.remove(index[1]);
}
}
//按集合的规模排序
Collections.sort(list, new Comparator<Set<Integer>>() {
@Override
public int compare(Set<Integer> o1, Set<Integer> o2) {
if(o1.size()>o2.size())
return -1;
return 0;
}
});
//遍历输出规模
for(Set<Integer>s:list){
System.out.println(s.size());
}
} catch (NumberFormatException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}