#![allow(unused_imports)] #![allow(dead_code)] //use rust::library::data_structure::*; //use rust::library::math::mod_int; use crate::rust::*; fn main() { input!{ n:usize,m:usize, v:[(i32,i32);m], } for i in 0..v.len(){ if i==0{ if !(v[i].1, rank:Vec, } impl UF{ pub fn new(n:usize)->UF{ let mut v=vec![0;n]; for i in 0..n{ v[i]=i; } UF{ par:v, rank:vec![1;n], } } pub fn root(&mut self,x:usize)->usize{ if x==self.par[x]{ x }else{ let par=self.par[x]; let res=self.root(par); self.par[x]=res; res } } pub fn same(&mut self,a:usize,b:usize)->bool{ self.root(a)==self.root(b) } pub fn unite(&mut self,a:usize,b:usize)->bool{ let ap=self.root(a); let bp=self.root(b); if ap==bp{ return false; } if self.rank[ap]usize{ let ap=self.root(a); self.rank[ap] } } } // mod union_find } // mod data_structure pub mod math { pub mod mod_int { pub fn hello(){ println!("hello"); } } // mod mod_int } // mod math pub mod util { pub mod io { #[macro_export] macro_rules! input { (source = $s:expr, $($r:tt)*) => { let mut iter = $s.split_whitespace(); input_inner!{iter, $($r)*} }; ($($r:tt)*) => { let mut s = { use std::io::Read; let mut s = String::new(); std::io::stdin().read_to_string(&mut s).unwrap(); s }; let mut iter = s.split_whitespace(); input_inner!{iter, $($r)*} }; } #[macro_export] macro_rules! input_inner { ($iter:expr) => {}; ($iter:expr, ) => {}; ($iter:expr, $var:ident : $t:tt $($r:tt)*) => { let $var = read_value!($iter, $t); input_inner!{$iter $($r)*} }; } #[macro_export] macro_rules! read_value { ($iter:expr, ( $($t:tt),* )) => { ( $(read_value!($iter, $t)),* ) }; ($iter:expr, [ $t:tt ; $len:expr ]) => { (0..$len).map(|_| read_value!($iter, $t)).collect::>() }; ($iter:expr, chars) => { read_value!($iter, String).chars().collect::>() }; ($iter:expr, usize1) => { read_value!($iter, usize) - 1 }; ($iter:expr, $t:ty) => { $iter.next().unwrap().parse::<$t>().expect("Parse error") }; } } // mod io } // mod util } // mod library } // mod rust