//入力チェック #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; //input from stdin istream& operator >> (istream& is, vector& vec){for(int& val: vec) scanf("%d", &val); return is;} istream& operator >> (istream& is, vector& vec){for(long long& val: vec) scanf("%lld",/*"%I64d",*/ &val); return is;} istream& operator >> (istream& is, vector& vec){for(double& val: vec) scanf("%lf", &val); return is;} char buff[200000]; istream& operator >> (istream& is, vector& vec){for(string& val: vec) {scanf("%s", buff); val=buff;}; return is;} template istream& operator >> (istream& is, vector& vec){for(T& val: vec) is >> val; return is;} template istream& operator , (istream& is, T& val){ return is >> val;} template ostream& operator << (ostream& os, const vector& vec){for(int i=0; i ostream& operator , (ostream& os, T& val){ return os << " " << val;} template ostream& operator >> (ostream& os, T& val){ return os << " " << val;} using namespace std; class UnionFindTree{ struct base_node{ int parent; int rank; int size; }; vector node; public: UnionFindTree(int n){ node.resize(n); for(int i=0; i node[y].rank){ node[y].parent = x; node[x].size += node[y].size; }else{ node[x].rank++; unite(x,y); } } }; int main_(){ int n; cin >> n; vector a(n); for(int i=0; i> a[i]; assert(1 <= a[i] && a[i] <= 1000); } UnionFindTree uft(n); vector> G(n); for(int i=0; i> u,v; scanf("%d%d", &u,&v); assert(1<=u && u<=n); assert(1<=v && v<=n); assert(u != v); u--; v--; uft.unite(u,v); G[u].push_back(v); G[v].push_back(u); } assert(uft.size(0) == n); int unko; assert(!(cin >> unko)); return 0; } #include int main(){ //auto t = clock(); main_(); //cerr << (clock()-t) << "[ms]" << endl; return 0; }