#include #include #include #include using namespace std; int main() { int n = 0, f = 0, l = 0; while ( cin >> n && n ) { vector piles[100]; for ( int i = 0; i < n; i++ ) { piles[i].push_back( i + 1 ); } while ( cin >> f >> l && f ) { if ( f == l ) { continue; } int pf = 0, pl = 0; vector::iterator itrf, itrl; for ( int i = 0; i < n; i++ ) { vector::iterator itr = find( piles[i].begin(), piles[i].end(), f ); if ( itr != piles[i].end() ) { pf = i; itrf = itr; break; } } if ( l ) { for ( int i = 0; i < n; i++ ) { vector::iterator itr = find( piles[i].begin(), piles[i].end(), l ); if ( itr != piles[i].end() ) { pl = i; itrl = itr; break; } } if ( pf == pl ) { if ( itrf < itrl ) { vector temp( itrf + 1, piles[pf].end() ); piles[pf].erase( itrf, piles[pf].end() ); for ( int i = 0, j = 0; i < n && j < temp.size(); i++ ) { if ( !piles[i].size() ) { piles[i].push_back( temp[j] ); if ( temp[j] == l ) { piles[i].push_back( f ); } j++; } } } } else { vector temp( itrf + 1, piles[pf].end() ); piles[pf].erase( itrf, piles[pf].end() ); piles[pl].push_back( f ); for ( int i = 0, j = 0; i < n && j < temp.size(); i++ ) { if ( !piles[i].size() ) { piles[i].push_back( temp[j++] ); } } } } else { if ( itrf != piles[pf].begin() ) { vector temp( itrf, piles[pf].end() ); piles[pf].erase( itrf, piles[pf].end() ); for ( int i = 0, j = 0; i < n && j < temp.size(); i++ ) { if ( !piles[i].size() ) { piles[i].push_back( temp[j++] ); } } } } } multiset heights; for ( int i = 0; i < n; i++ ) { if ( piles[i].size() ) { heights.insert( piles[i].size() ); } } for ( multiset::iterator itr = heights.begin(); itr != heights.end(); itr++ ) { cout << *itr << endl; } cout << "end" << endl; } return 0; }