1+ #include < iostream>
2+ #include < vector>
3+
4+ class Database
5+ {
6+ public:
7+ Database (unsigned numTables) {
8+ // std::cout << __PRETTY_FUNCTION__ << std::endl;
9+ _tables.resize (numTables + 1 );
10+ _rank.resize (numTables + 1 );
11+ _parent.resize (numTables + 1 );
12+ _maxSize = 0 ;
13+ for (int i = 1 ; i < numTables + 1 ; ++i) {
14+ std::cin >> _tables[i];
15+ if (_tables[i] > _maxSize)
16+ _maxSize = _tables[i];
17+ makeSet (i);
18+ }
19+ }
20+ ~Database (){}
21+
22+ void join (unsigned i, unsigned j) {
23+ // std::cout << __PRETTY_FUNCTION__ << std::endl;
24+ unsigned i_id, j_id;
25+
26+ i_id = find (i);
27+ j_id = find (j);
28+ if (i_id == j_id)
29+ return ;
30+ if (_rank[i_id] > _rank[j_id]) {
31+ _parent[j_id] = i_id;
32+ _tables[i_id] += _tables[j_id];
33+ _tables[j_id] = 0 ;
34+ }
35+ else {
36+ _parent[i_id] = j_id;
37+ if (_rank[i_id] == _rank[j_id])
38+ _rank[j_id] += 1 ;
39+ _tables[j_id] += _tables[i_id];
40+ _tables[i_id] = 0 ;
41+ }
42+ unsigned max = std::max (_tables[j_id], _tables[i_id]);
43+ _maxSize = std::max (max, _maxSize);
44+ }
45+
46+ unsigned maxSize () { return _maxSize; }
47+
48+ void print () {
49+ for (int i = 1 ; i < _tables.size (); ++i) {
50+ std::cout << " tables [" << _tables[i] << " ]\t parent ["
51+ << _parent[i] << " ]\t rank [" << _rank[i] << " ]" << std::endl;
52+ }
53+ std::cout << " ----------------------------" << std::endl;
54+ }
55+ private:
56+ void makeSet (unsigned i) {
57+ // std::cout << __PRETTY_FUNCTION__ << std::endl;
58+ _parent[i] = i;
59+ _rank[i] = 0 ;
60+ }
61+
62+ unsigned find (unsigned i) {
63+ // std::cout << __PRETTY_FUNCTION__ << std::endl;
64+ while (i != _parent[i])
65+ i = _parent[i];
66+ return i;
67+ }
68+ unsigned _maxSize;
69+ std::vector<unsigned > _tables;
70+ std::vector<unsigned > _parent;
71+ std::vector<unsigned > _rank;
72+ };
73+
74+ int main (void ) {
75+
76+ int numTables, numRequests;
77+
78+ std::cin >> numTables >> numRequests;
79+
80+ Database database (numTables);
81+ // database.print();
82+ for (int i = 0 ; i < numRequests; ++i) {
83+ int dest, src;
84+ std::cin >> dest >> src;
85+ database.join (dest, src);
86+ // database.print();
87+ std::cout << database.maxSize () << std::endl;
88+ }
89+
90+ return 0 ;
91+ }
0 commit comments