using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; class TEST{ static void Main(){ Sol mySol =new Sol(); mySol.Solve(); } } class Sol{ public void Solve(){ var UF = new UnionFind(N); HashSet H = new HashSet(); for(int i=0;i[] L = new List[N]; for(int i=0;i(); } for(int i=0;i=0;j--){ if(UF.IsUnited(C[j],D[j]))continue; if(UF.IsUnited(0,C[j])){ foreach(var n in L[UF.Parent(D[j])])history[n] = j+1; } if(UF.IsUnited(0,D[j])){ foreach(var n in L[UF.Parent(C[j])])history[n] = j+1; } if(L[UF.Parent(D[j])].Count > L[UF.Parent(C[j])].Count){ //L[UF.Parent(D[j])].AddRange(L[UF.Parent(C[j])]); foreach(var n in L[UF.Parent(C[j])])L[UF.Parent(D[j])].Add(n); UF.Unite(C[j],D[j]); }else{ //L[UF.Parent(C[j])].AddRange(L[UF.Parent(D[j])]); foreach(var n in L[UF.Parent(D[j])])L[UF.Parent(C[j])].Add(n); UF.Unite(D[j],C[j]); } } for(int i=1;iint.Parse(e));} static long[] rla(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>long.Parse(e));} static double[] rda(char sep=' '){return Array.ConvertAll(Console.ReadLine().Split(sep),e=>double.Parse(e));} } class UnionFind{ int[] parent; int[] mem; int compo; int N; public UnionFind(int n_){ Initialize(n_); } public void Initialize(int n_){ N=n_; parent=new int[N]; mem=new int[N]; for(int i=0;i