using AtCoder.Internal; using Kzrnm.Competitive; using Kzrnm.Competitive.IO; using System; using System.Buffers; using System.Buffers.Text; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.Globalization; using System.IO; using System.Linq; using System.Numerics; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; using 凾 = System.Runtime.CompilerServices.MethodImplAttribute; partial class Program { const bool __ManyTestCases = false; #if !LOCAL_RUNNING static void Main()=>new Program(new PropertyConsoleReader(),new Utf8ConsoleWriter()).Run(); [凾(256)] #endif private ConsoleOutput? Calc() { int N = cr; var tree = GraphBuilder.CreateTree(N, cr).ToTree(); var dp = tree.Rerooting().Run().Select((b, i) => (b, i)).Where(t => !t.b).Select(t => t.i + 1).ToArray(); cw.WriteLine(dp.Length); cw.WriteLines(dp); return null; } } struct Op : IRerootingOperator { public bool Identity => default; [凾(256)] public bool Merge(bool x, bool y) => x || y; [凾(256)] public bool Propagate(bool x, int parent, GraphEdge edge) => !x; } #region Expanded by https://github.com/kzrnm/SourceExpander //LICENSE: //https://github.com/kzrnm/Kzrnm.Competitive/blob/master/LICENSE //https://github.com/kzrnm/Kzrnm.Competitive/blob/master/3rd-party%20Licenses.txt #pragma warning disable namespace AtCoder.Internal{public class CSR:IEnumerable<(int from,TEdge edge)>{public readonly int[]Start;public readonly TEdge[]EList;public CSR(int n,ICollection<(int from,TEdge e)>edges){Start=new int[n+1];EList=new TEdge[edges.Count];foreach(var(from,_)in edges){Start[from+1]++;}for(int i=1;i<=n;i++){Start[i]+=Start[i-1];}var counter=(int[])Start.Clone();foreach(var(from,e)in edges){EList[counter[from]++]=e;}}public Enumerator GetEnumerator()=>new Enumerator(this);IEnumerator<(int from,TEdge edge)>IEnumerable<(int from,TEdge edge)>.GetEnumerator()=>GetEnumerator();IEnumerator IEnumerable.GetEnumerator()=>GetEnumerator();public struct Enumerator:IEnumerator<(int from,TEdge edge)>{public Enumerator(CSRg){_g=g;index=-1;start=0;}private readonly CSR_g;private int index;private int start;public(int from,TEdge edge)Current=>(start,_g.EList[index]);object IEnumerator.Current=>Current;[凾(256)]public bool MoveNext(){if( ++index<_g.Start[start+1])return true;return MoveNextStart();}private bool MoveNextStart(){for( ++start;start+1<_g.Start.Length;++start)if(index<_g.Start[start+1])return true;return false;}public void Reset(){index=-1;start=0;}void IDisposable.Dispose(){}}}} namespace Kzrnm.Competitive.IO{using static Utf8Parser;using _R=ConsoleReader;public class ConsoleReader{internal const int BufSize=1<<12;internal readonly Stream input;internal readonly Encoding encoding;internal readonly byte[]buf;internal int pos;internal int len;[凾(256)]public ConsoleReader():this(Console.OpenStandardInput(),Console.InputEncoding,BufSize){}[凾(256)]public ConsoleReader(Stream input,Encoding encoding):this(input,encoding,BufSize){}[凾(256)]public ConsoleReader(Stream input,Encoding encoding,int bufferSize){this.input=input;this.encoding=encoding;buf=new byte[bufferSize];}[凾(256)]private void FillEntireNumber(){if((uint)pos>=(uint)buf.Length)FillNextBuffer();while(buf[pos]<=' ')if( ++pos>=len)FillNextBuffer();if(pos+21>=buf.Length&&buf[buf.Length-1]>' ')FillEntireNumberImpl();}private void FillEntireNumberImpl(){buf.AsSpan(pos,len-pos).CopyTo(buf);len-=pos;pos=0;var numberOfBytes=input.Read(buf,len,buf.Length-len);if(numberOfBytes==0)buf[len++]=10;else if(numberOfBytes+len=len)FillNextBuffer();return buf[pos++];}[凾(256)]public T Read(){if(typeof(T)==typeof(int))return(T)(object)Int();if(typeof(T)==typeof(uint))return(T)(object)UInt();if(typeof(T)==typeof(long))return(T)(object)Long();if(typeof(T)==typeof(ulong))return(T)(object)ULong();if(typeof(T)==typeof(double))return(T)(object)Double();if(typeof(T)==typeof(decimal))return(T)(object)Decimal();if(typeof(T)==typeof(char))return(T)(object)Char();if(typeof(T)==typeof(string))return(T)(object)Ascii();return Throw();}static T Throw()=>throw new NotSupportedException(typeof(T).Name);[凾(256)]public int Int(){FillEntireNumber();TryParse(buf.AsSpan(pos),out int v,out int bc);pos+=bc;return v;}[凾(256)]public uint UInt(){FillEntireNumber();TryParse(buf.AsSpan(pos),out uint v,out int bc);pos+=bc;return v;}[凾(256)]public long Long(){FillEntireNumber();TryParse(buf.AsSpan(pos),out long v,out int bc);pos+=bc;return v;}[凾(256)]public ulong ULong(){FillEntireNumber();TryParse(buf.AsSpan(pos),out ulong v,out int bc);pos+=bc;return v;}[凾(256)]public double Double(){FillEntireNumber();TryParse(buf.AsSpan(pos),out double v,out int bc);pos+=bc;return v;}[凾(256)]public decimal Decimal(){FillEntireNumber();TryParse(buf.AsSpan(pos),out decimal v,out int bc);pos+=bc;return v;}[凾(256)]public string String(){var sb=new List();;byte b;do b=ReadByte();while(b<=' ');do{sb.Add(b);b=ReadByte();}while(' '();byte b;do b=ReadByte();while(b<=' ');do{sb.Add(b);b=ReadByte();}while(b!='\n'&&b!='\r');return encoding.GetString(sb.ToArray());}[凾(256)]public char Char(){byte b;do b=ReadByte();while(b<=' ');return(char)b;}[凾(256)]public int Int0()=>Int()-1;[凾(256)]public uint UInt0()=>UInt()-1;[凾(256)]public long Long0()=>Long()-1;[凾(256)]public ulong ULong0()=>ULong()-1;[凾(256)]public static implicit operator int(_R cr)=>cr.Int();[凾(256)]public static implicit operator uint(_R cr)=>cr.UInt();[凾(256)]public static implicit operator long(_R cr)=>cr.Long();[凾(256)]public static implicit operator ulong(_R cr)=>cr.ULong();[凾(256)]public static implicit operator double(_R cr)=>cr.Double();[凾(256)]public static implicit operator decimal(_R cr)=>cr.Decimal();[凾(256)]public static implicit operator string(_R cr)=>cr.Ascii();public T[]Repeat(int count){var arr=new T[count];for(int i=0;i();return arr;}}} namespace Kzrnm.Competitive.IO{public sealed class PropertyConsoleReader:ConsoleReader{public PropertyConsoleReader():base(){}public PropertyConsoleReader(Stream input,Encoding encoding):base(input,encoding){}public PropertyConsoleReader(Stream input,Encoding encoding,int bufferSize):base(input,encoding,bufferSize){}public new int Int=>Int();public new int Int0=>Int0();public new uint UInt=>UInt();public new uint UInt0=>UInt0();public new long Long=>Long();public new long Long0=>Long0();public new ulong ULong=>ULong();public new ulong ULong0=>ULong0();public new double Double=>Double();public new decimal Decimal=>Decimal();public new string String=>String();public new string Ascii=>Ascii();public new string Line=>Line();public new char Char=>Char();}} namespace Kzrnm.Competitive.IO{using static Utf8Formatter;using _W=Utf8ConsoleWriter;public sealed class Utf8ConsoleWriter:IDisposable{internal static readonly UTF8Encoding Utf8NoBom=new UTF8Encoding(false);internal const int BufSize=1<<12;internal readonly Stream output;internal byte[]buf;internal int len;public Utf8ConsoleWriter():this(Console.OpenStandardOutput()){}public Utf8ConsoleWriter(Stream output):this(output,BufSize){}public Utf8ConsoleWriter(Stream output,int bufferSize){this.output=output;buf=new byte[bufferSize];}public StreamWriter ToStreamWriter(){Flush();return new StreamWriter(output,Utf8NoBom);}[凾(256)]public void Flush(){output.Write(buf,0,len);len=0;}void IDisposable.Dispose()=>Flush();[凾(256)]private SpanEnsureBuf(int size){if(buf.Length-len(T v){void FormatFloat(double d,out int b)=>TryFormat(d,EnsureBuf(Math.Max(25+(int)Math.Log10(Math.Abs(d)),32)),out b,new StandardFormat('F',20));void FormatDec(decimal d,out int b)=>TryFormat(d,EnsureBuf(Math.Max(25+(int)Math.Log10((double)Math.Abs(d)),32)),out b,new StandardFormat('F',20));int bw;if(typeof(T)==typeof(int))TryFormat((int)(object)v,EnsureBuf(21),out bw);else if(typeof(T)==typeof(long))TryFormat((long)(object)v,EnsureBuf(21),out bw);else if(typeof(T)==typeof(uint))TryFormat((uint)(object)v,EnsureBuf(21),out bw);else if(typeof(T)==typeof(ulong))TryFormat((ulong)(object)v,EnsureBuf(21),out bw);else if(typeof(T)==typeof(short))TryFormat((short)(object)v,EnsureBuf(9),out bw);else if(typeof(T)==typeof(ushort))TryFormat((ushort)(object)v,EnsureBuf(9),out bw);else if(typeof(T)==typeof(byte))TryFormat((byte)(object)v,EnsureBuf(9),out bw);else if(typeof(T)==typeof(sbyte))TryFormat((sbyte)(object)v,EnsureBuf(9),out bw);else if(typeof(T)==typeof(float))FormatFloat((float)(object)v,out bw);else if(typeof(T)==typeof(double))FormatFloat((double)(object)v,out bw);else if(typeof(T)==typeof(decimal))FormatDec((decimal)(object)v,out bw);else if(typeof(T)==typeof(char)){var dst=EnsureBuf(6);var c=(char)(object)v;if(c<0x007f){dst[0]=(byte)c;bw=1;}else{Spans=stackalloc char[1]{c};bw=Utf8NoBom.GetBytes(s,dst);}}else if(v is char[]charr)return Write(charr.AsSpan());else if(v is IUtf8ConsoleWriterFormatter f){f.Write(this);return this;}else return Write(v.ToString().AsSpan());len+=bw;return this;}[凾(256|512)]public _W Write(ReadOnlySpanv){var mlen=Utf8NoBom.GetMaxByteCount(v.Length);if(mlen>buf.Length){Flush();buf=new byte[mlen*2];}else if(mlen>buf.Length-len){Flush();}var bw=Utf8NoBom.GetBytes(v,buf.AsSpan(len));len+=bw;return this;}[凾(256)]public _W WriteLine()=>Write('\n');[凾(256)]public _W WriteLine(T v){Write(v);return Write('\n');}[凾(256)]public _W WriteLine(ReadOnlySpanv){Write(v);return Write('\n');}[凾(256)]public _W WriteLineJoin(IEnumerablecol)=>WriteMany(' ',col);[凾(256)]public _W WriteLineJoin((T1,T2)tuple){Write(tuple.Item1);Write(' ');return WriteLine(tuple.Item2);}[凾(256)]public _W WriteLineJoin((T1,T2,T3)tuple){Write(tuple.Item1);Write(' ');Write(tuple.Item2);Write(' ');return WriteLine(tuple.Item3);}[凾(256)]public _W WriteLineJoin((T1,T2,T3,T4)tuple){Write(tuple.Item1);Write(' ');Write(tuple.Item2);Write(' ');Write(tuple.Item3);Write(' ');return WriteLine(tuple.Item4);}[凾(256)]public _W WriteLineJoin(TTuple tuple)where TTuple:ITuple{var col=new object[tuple.Length];for(int i=0;iWriteMany(' ',col);[凾(256)]public _W WriteLineJoin(T1 v1,T2 v2){Write(v1);Write(' ');return WriteLine(v2);}[凾(256)]public _W WriteLineJoin(T1 v1,T2 v2,T3 v3){Write(v1);Write(' ');Write(v2);Write(' ');return WriteLine(v3);}[凾(256)]public _W WriteLineJoin(T1 v1,T2 v2,T3 v3,T4 v4){Write(v1);Write(' ');Write(v2);Write(' ');Write(v3);Write(' ');return WriteLine(v4);}[凾(256)]public _W WriteLineJoin(params T[]col)=>WriteMany(' ',(ReadOnlySpan)col);[凾(256)]public _W WriteLineJoin(Spancol)=>WriteMany(' ',(ReadOnlySpan)col);[凾(256)]public _W WriteLineJoin(ReadOnlySpancol)=>WriteMany(' ',col);[凾(256)]public _W WriteLines(IEnumerablecol)=>WriteMany('\n',col);[凾(256)]public _W WriteLines(T[]col)=>WriteMany('\n',(ReadOnlySpan)col);[凾(256)]public _W WriteLines(Spancol)=>WriteMany('\n',(ReadOnlySpan)col);[凾(256)]public _W WriteLines(ReadOnlySpancol)=>WriteMany('\n',col);[凾(256)]public _W WriteGrid(IEnumerable>cols){foreach(var col in cols)WriteLineJoin(col);return this;}[凾(256)]public _W WriteGrid(IEnumerabletuples)where TTuple:ITuple{foreach(var tup in tuples)WriteLineJoin(tup);return this;}[凾(256)]private _W WriteMany(char sep,IEnumerablecol){if(col is T[]array)return WriteMany(sep,(ReadOnlySpan)array);var en=col.GetEnumerator();if(en.MoveNext()){Write(en.Current);while(en.MoveNext()){Write(sep);Write(en.Current);}}return WriteLine();}[凾(256)]private _W WriteMany(char sep,ReadOnlySpancol){if(col.Length>0){Write(col[0]);foreach(var c in col.Slice(1)){Write(sep);Write(c);}}return WriteLine();}}public interface IUtf8ConsoleWriterFormatter{void Write(_W cw);}} namespace Kzrnm.Competitive{using O=ConsoleOutput;public static class ConsoleOutputExt{[凾(256)]public static O ToConsoleOutput(this T f)where T:IUtf8ConsoleWriterFormatter{var cw=O.cw;f.Write(cw);return cw.WriteLine();}}public struct ConsoleOutput{public static Utf8ConsoleWriter cw;public static implicit operator O(int v)=>cw.WriteLine(v);public static implicit operator O(long v)=>cw.WriteLine(v);public static implicit operator O(uint v)=>cw.WriteLine(v);public static implicit operator O(ulong v)=>cw.WriteLine(v);public static implicit operator O(double v)=>cw.WriteLine(v);public static implicit operator O(decimal v)=>cw.WriteLine(v);public static implicit operator O(char v)=>cw.WriteLine(v);public static implicit operator O(ReadOnlySpanv)=>cw.WriteLine(v);public static implicit operator O(char[]v)=>cw.WriteLine((ReadOnlySpan)v);public static implicit operator O(string v)=>cw.WriteLine((ReadOnlySpan)v);public static implicit operator O(bool v)=>cw.WriteLine((ReadOnlySpan)(v?"Yes":"No"));public static implicit operator O(Utf8ConsoleWriter _)=>default;}} internal partial class Program{public PropertyConsoleReader cr;public Utf8ConsoleWriter cw;public Program(PropertyConsoleReader r,Utf8ConsoleWriter w){cr=r;ConsoleOutput.cw=cw=w;CultureInfo.CurrentCulture=CultureInfo.InvariantCulture;}public void Run(){int Q=__ManyTestCases?cr.Int:1;while( --Q>=0)Calc();cw.Flush();}} namespace Kzrnm.Competitive{public class SparseTablewhere TOp:struct,ISparseTableOperator{private static TOp op=default;private readonly TValue[][]st;public int Length{get;}public SparseTable(TValue[]array){Length=array.Length;st=new TValue[BitOperations.Log2((uint)Length)+1][];st[0]=(TValue[])array.Clone();for(int i=1;iProd(l,l+length);[凾(256)]public TValue Prod(int l,int r){var b=BitOperations.Log2((uint)(r-l));var stb=st[b];return op.Operate(stb[l],stb[r-(1<st;public DebugView(SparseTablest){this.st=st;}public DebugItem[]Items{get{var items=new List(st.st.Length*st.Length);for(int b=0;b{T Operate(T x,T y);}} namespace Kzrnm.Competitive{public static class __ArrayExtension{[凾(256)]public static T[]Fill(this T[]arr,T value){arr.AsSpan().Fill(value);return arr;}[凾(256)]public static T[]Sort(this T[]arr){Array.Sort(arr);return arr;}[凾(256)]public static string[]Sort(this string[]arr)=>Sort(arr,StringComparer.Ordinal);[凾(256)]public static T[]Sort(this T[]arr,Funcselector)where U:IComparable{Array.Sort(arr.Select(selector).ToArray(),arr);return arr;}[凾(256)]public static T[]Sort(this T[]arr,Comparisoncomparison){Array.Sort(arr,comparison);return arr;}[凾(256)]public static T[]Sort(this T[]arr,IComparercomparer){Array.Sort(arr,comparer);return arr;}[凾(256)]public static T[]Reverse(this T[]arr){Array.Reverse(arr);return arr;}[凾(256)]public static ref T Get(this T[]arr,int index){if(index<0)index+=arr.Length;return ref arr[index];}[凾(256)]public static ref readonly T GetOrDummy(this ReadOnlySpanarr,int index,T dummy=default){if((uint)index<(uint)arr.Length)return ref arr[index];Dummy.dummy=dummy;return ref Dummy.dummy;}[凾(256)]public static ref T GetOrDummy(this Spanarr,int index,T dummy=default){if((uint)index<(uint)arr.Length)return ref arr[index];Dummy.dummy=dummy;return ref Dummy.dummy;}[凾(256)]public static ref T GetOrDummy(this T[]arr,int index,T dummy=default)=>ref GetOrDummy(arr.AsSpan(),index,dummy);[凾(256)]public static ref T GetOrDummy(this T[][]arr,int index1,int index2,T dummy=default){if((uint)index1<(uint)arr.Length)return ref GetOrDummy(arr[index1],index2,dummy);Dummy.dummy=dummy;return ref Dummy.dummy;}[凾(256)]public static ref T GetOrDummy(this T[][][]arr,int index1,int index2,int index3,T dummy=default){if((uint)index1<(uint)arr.Length)return ref GetOrDummy(arr[index1],index2,index3,dummy);Dummy.dummy=dummy;return ref Dummy.dummy;}private static class Dummy{public static T dummy;}[凾(256)]public static int FindByBinarySearch(this T[]arr,TCv value)where TCv:IComparable =>FindByBinarySearch((ReadOnlySpan)arr,value);[凾(256)]public static int FindByBinarySearch(this Spanarr,TCv value)where TCv:IComparable =>FindByBinarySearch((ReadOnlySpan)arr,value);[凾(256)]public static int FindByBinarySearch(this ReadOnlySpanarr,TCv value)where TCv:IComparable{int ix=arr.BinarySearch(value);if(ix<0)ix=~ix;return ix;}}} namespace Kzrnm.Competitive{public static class __MemoryMarshalExtension{private class ArrayVal{public T[]arr;}[凾(256)]public static SpanAsSpan(this Listlist,int start=0)=>Unsafe.As>(list).arr.AsSpan(start,list.Count-start);[凾(256)]public static SpanCast(this Spanspan)where TFrom:struct where TTo:struct=>MemoryMarshal.Cast(span);[凾(256)]public static ReadOnlySpanCast(this ReadOnlySpanspan)where TFrom:struct where TTo:struct=>MemoryMarshal.Cast(span);[凾(256)]public static ref T GetReference(this Spanspan)=>ref MemoryMarshal.GetReference(span);[凾(256)]public static ref T GetReference(this ReadOnlySpanspan)=>ref MemoryMarshal.GetReference(span);}} namespace Kzrnm.Competitive{public static class __CollectionTupleExtension_Stack{[凾(256)]public static bool TryPop(this Stack<(T1,T2)>stack,out T1 item1,out T2 item2){var ok=stack.TryPop(out var tuple);(item1,item2)=tuple;return ok;}[凾(256)]public static bool TryPop(this Stack<(T1,T2,T3)>stack,out T1 item1,out T2 item2,out T3 item3){var ok=stack.TryPop(out var tuple);(item1,item2,item3)=tuple;return ok;}[凾(256)]public static bool TryPeek(this Stack<(T1,T2)>stack,out T1 item1,out T2 item2){var ok=stack.TryPeek(out var tuple);(item1,item2)=tuple;return ok;}[凾(256)]public static bool TryPeek(this Stack<(T1,T2,T3)>stack,out T1 item1,out T2 item2,out T3 item3){var ok=stack.TryPeek(out var tuple);(item1,item2,item3)=tuple;return ok;}}} namespace Kzrnm.Competitive{public class GraphBuilder{internal readonly EdgeContaineredgeContainer;public GraphBuilder(int size,bool isDirected){edgeContainer=new EdgeContainer(size,isDirected);}public static GraphBuilder Create(int count,ConsoleReader cr,int edgeCount,bool isDirected){var gb=new GraphBuilder(count,isDirected);for(var i=0;iCreateWithEdgeIndex(int count,ConsoleReader cr,int edgeCount,bool isDirected){var gb=new GraphBuilder(count,isDirected);for(var i=0;iedgeContainer.Add(from,new GraphEdge(to));public SimpleGraphToGraph()=>GraphBuilderLogic.ToGraph,GraphNode,GraphEdge,TOp>(edgeContainer);public TreeGraphToTree(int root=0)=>GraphBuilderLogic.ToTree,TreeNode,GraphEdge,TOp>(edgeContainer,root);struct TOp:IGraphBuildOperator,GraphNode,GraphEdge>,ITreeBuildOperator,TreeNode,GraphEdge>{[凾(256)]public SimpleGraphGraph(GraphNode[]nodes,CSRedges)=>new SimpleGraph(nodes,edges);[凾(256)]public GraphNode Node(int i,GraphEdge[]parents,GraphEdge[]children)=>new GraphNode(i,parents,children);[凾(256)]public TreeGraphTree(TreeNode[]nodes,int root,HeavyLightDecompositionhl)=>new TreeGraph(nodes,root,hl);[凾(256)]public TreeNode TreeNode(int i,int size,TreeNode parent,GraphEdge edge,GraphEdge[]children)=>new TreeNode(i,size,edge.Reversed(parent.Index),parent.Depth+1,children);[凾(256)]public TreeNode TreeRootNode(int i,int size,GraphEdge[]children)=>new TreeNode(i,size,GraphEdge.None,0,children);}}public readonly struct GraphEdge:IGraphEdge,IReversable,IEquatable{public static GraphEdge None{get;}=new GraphEdge(-1);public GraphEdge(int to){To=to;}public int To{get;}[凾(256)]public static implicit operator int(GraphEdge e)=>e.To;public override string ToString()=>To.ToString();[凾(256)]public GraphEdge Reversed(int from)=>new GraphEdge(from);public override int GetHashCode()=>To;public override bool Equals(object obj)=>obj is GraphEdge edge&&Equals(edge);public bool Equals(GraphEdge other)=>To==other.To;public static bool operator==(GraphEdge left,GraphEdge right)=>left.Equals(right);public static bool operator!=(GraphEdge left,GraphEdge right)=>!left.Equals(right);}public class GraphNode:IGraphNode,IEquatable{public GraphNode(int i,GraphEdge[]parents,GraphEdge[]children){Index=i;Parents=parents;Children=children;}public int Index{get;}public GraphEdge[]Parents{get;}public GraphEdge[]Children{get;}public bool IsDirected=>Parents!=Children;public override string ToString()=>$"children: {string.Join(",",Children)}";public override bool Equals(object obj)=>obj is GraphNode d&&Equals(d);public bool Equals(GraphNode other)=>Index==other?.Index;public override int GetHashCode()=>Index;}public class TreeNode:ITreeNode,IEquatable{public TreeNode(int i,int size,GraphEdge parent,int depth,GraphEdge[]children){Index=i;Parent=parent;Children=children;Depth=depth;Size=size;}public int Index{get;}public GraphEdge Parent{get;}public GraphEdge[]Children{get;}public int Depth{get;}public int Size{get;}public override string ToString()=>$"children: {string.Join(",",Children)}";public override bool Equals(object obj)=>obj is TreeNode node&&Equals(node);public bool Equals(TreeNode other)=>other!=null&&Index==other.Index;public override int GetHashCode()=>Index;}} namespace Kzrnm.Competitive{public class GraphBuilder{internal readonly EdgeContainer>edgeContainer;public GraphBuilder(int size,bool isDirected){edgeContainer=new EdgeContainer>(size,isDirected);}[凾(256)]public void Add(int from,int to,T data)=>edgeContainer.Add(from,new GraphEdge(to,data));public SimpleGraph>,GraphEdge>ToGraph()=>GraphBuilderLogic.ToGraph>,GraphEdge>,GraphNode>,GraphEdge,TOp>(edgeContainer);public TreeGraph,GraphEdge>ToTree(int root=0)=>GraphBuilderLogic.ToTree,GraphEdge>,TreeNode,GraphEdge,TOp>(edgeContainer,root);struct TOp:IGraphBuildOperator>,GraphEdge>,GraphNode>,GraphEdge>,ITreeBuildOperator,GraphEdge>,TreeNode,GraphEdge>{[凾(256)]public SimpleGraph>,GraphEdge>Graph(GraphNode>[]nodes,CSR>edges)=>new SimpleGraph>,GraphEdge>(nodes,edges);[凾(256)]public GraphNode>Node(int i,GraphEdge[]parents,GraphEdge[]children)=>new GraphNode>(i,parents,children);[凾(256)]public TreeGraph,GraphEdge>Tree(TreeNode[]nodes,int root,HeavyLightDecomposition,GraphEdge>hl)=>new TreeGraph,GraphEdge>(nodes,root,hl);[凾(256)]public TreeNodeTreeNode(int i,int size,TreeNodeparent,GraphEdgeedge,GraphEdge[]children)=>new TreeNode(i,size,edge.Reversed(parent.Index),parent.Depth+1,children);[凾(256)]public TreeNodeTreeRootNode(int i,int size,GraphEdge[]children)=>new TreeNode(i,size,GraphEdge.None,0,children);}}public readonly struct GraphEdge:IGraphEdge,IGraphData,IReversable>,IEquatable>{public static GraphEdgeNone{get;}=new GraphEdge(-1,default);public GraphEdge(int to,T data){To=to;Data=data;}public T Data{get;}public int To{get;}[凾(256)]public static implicit operator int(GraphEdgee)=>e.To;public override string ToString()=>$"to:{To}, Data:{Data}";[凾(256)]public void Deconstruct(out int to,out T data){to=To;data=Data;}[凾(256)]public GraphEdgeReversed(int from)=>new GraphEdge(from,Data);public override int GetHashCode()=>To;public override bool Equals(object obj)=>obj is GraphEdgeedge&&Equals(edge);public bool Equals(GraphEdgeother)=>To==other.To;public static bool operator==(GraphEdgeleft,GraphEdgeright)=>left.Equals(right);public static bool operator!=(GraphEdgeleft,GraphEdgeright)=>!left.Equals(right);}public class GraphNode:IGraphNode,IEquatable>where TEdge:IGraphEdge{public GraphNode(int i,TEdge[]parents,TEdge[]children){Index=i;Parents=parents;Children=children;}public int Index{get;}public TEdge[]Parents{get;}public TEdge[]Children{get;}public bool IsDirected=>Parents!=Children;public override string ToString()=>$"children: {string.Join(",",Children)}";public override bool Equals(object obj)=>obj is GraphNoded&&Equals(d);public bool Equals(GraphNodeother)=>Index==other?.Index;public override int GetHashCode()=>Index;}public class TreeNode:ITreeNode>,IEquatable>{public TreeNode(int i,int size,GraphEdgeparent,int depth,GraphEdge[]children){Index=i;Parent=parent;Children=children;Depth=depth;Size=size;}public int Index{get;}public GraphEdgeParent{get;}public GraphEdge[]Children{get;}public int Depth{get;}public int Size{get;}public override string ToString()=>$"children: {string.Join(",",Children)}";public override bool Equals(object obj)=>obj is TreeNodenode&&Equals(node);public bool Equals(TreeNodeother)=>other!=null&&Index==other.Index;public override int GetHashCode()=>Index;}} namespace Kzrnm.Competitive{public class SimpleGraph:IGraphwhere TNode:IGraphNodewhere TEdge:IGraphEdge{public CSREdges{get;}internal TNode[]Nodes{get;}[凾(256)]public TNode[]AsArray()=>Nodes;public TNode this[int index]{[凾(256)]get=>Nodes[index];}public int Length=>Nodes.Length;public SimpleGraph(TNode[]array,CSRedges){Nodes=array;Edges=edges;}}public class TreeGraph:ITreeGraphwhere TNode:ITreeNodewhere TEdge:IGraphEdge{internal TNode[]Nodes{get;}[凾(256)]public TNode[]AsArray()=>Nodes;public TNode this[int index]{[凾(256)]get=>Nodes[index];}public int Length=>Nodes.Length;public int Root{get;}public HeavyLightDecompositionHlDecomposition{get;}public TreeGraph(TNode[]array,int root,HeavyLightDecompositionhl){Root=root;Nodes=array;HlDecomposition=hl;}}} namespace Kzrnm.Competitive{public interface IReversablewhere T:IGraphEdge{T Reversed(int from);}public interface IGraphEdge{int To{get;}}public interface IWGraphEdge:IGraphEdge{T Value{get;}}public interface IGraphData:IGraphEdge{T Data{get;}}public interface IGraphNodewhere TEdge:IGraphEdge{int Index{get;}TEdge[]Parents{get;}TEdge[]Children{get;}bool IsDirected{get;}}public interface ITreeNodewhere TEdge:IGraphEdge{int Index{get;}TEdge Parent{get;}TEdge[]Children{get;}int Depth{get;}int Size{get;}}public interface IGraphBuildOperator{TNode Node(int i,TEdge[]parents,TEdge[]children);TGraph Graph(TNode[]nodes,CSRedges);}public interface ITreeBuildOperatorwhere TNode:ITreeNodewhere TEdge:IGraphEdge{TNode TreeNode(int i,int size,TNode parent,TEdge parentEdge,TEdge[]children);TNode TreeRootNode(int i,int size,TEdge[]children);TTree Tree(TNode[]nodes,int root,HeavyLightDecompositionhl);}public interface IGraphwhere TNode:IGraphNodewhere TEdge:IGraphEdge{CSREdges{get;}TNode[]AsArray();TNode this[int index]{get;}int Length{get;}}public interface ITreeGraphwhere TNode:ITreeNodewhere TEdge:IGraphEdge{int Root{get;}TNode[]AsArray();TNode this[int index]{get;}int Length{get;}HeavyLightDecompositionHlDecomposition{get;}}public class EdgeContainerwhere TEdge:IGraphEdge{public int Length{get;}public bool IsDirected{get;}public readonly List<(int from,TEdge edge)>edges;public readonly int[]sizes;public readonly int[]parentSizes;public EdgeContainer(int size,bool isDirected){Length=size;IsDirected=isDirected;sizes=new int[size];parentSizes=isDirected?new int[size]:sizes;edges=new List<(int from,TEdge edge)>(size);}[凾(256)]public void Add(int from,TEdge edge){ ++sizes[from];++parentSizes[edge.To];edges.Add((from,edge));}[凾(256)]public CSRToCSR()=>new CSR(Length,edges);}internal static class GraphBuilderLogic{[凾(512)]public static TGraph ToGraph(EdgeContaineredgeContainer)where TGraph:IGraphwhere TNode:IGraphNodewhere TEdge:IGraphEdge,IReversablewhere TOp:struct,IGraphBuildOperator{var op=new TOp();var res=new TNode[edgeContainer.Length];var csr=edgeContainer.ToCSR();var counter=new int[res.Length];var parentCounter=edgeContainer.IsDirected?new int[res.Length]:counter;var children=SizeToArray(edgeContainer.sizes);var parents=edgeContainer.IsDirected?SizeToArray(edgeContainer.parentSizes):children;for(int i=0;i(EdgeContaineredgeContainer,int root)where TGraph:ITreeGraphwhere TNode:class,ITreeNodewhere TEdge:IGraphEdge,IReversablewhere TOp:struct,ITreeBuildOperator{var op=new TOp();int size=edgeContainer.Length;var edges=SizeToArray(edgeContainer.sizes);var idxs=new int[edges.Length];foreach(var(from,e)in edgeContainer.edges.AsSpan()){var to=e.To;edges[from][idxs[from]++]=e;edges[to][idxs[to]++]=e.Reversed(from);}idxs.AsSpan().Clear();var sz=new int[size].Fill(1);var children=SizeToArray(edgeContainer.sizes,-1,root);var parent=new int[size];parent[root]=-1;var stack=new Stack<(int Cur,int Chix)>(size);stack.Push((root,0));while(stack.TryPop(out var cur,out var ci)){var es=edges[cur];if( --ci>=0){var tp=es[ci].To;sz[cur]+=sz[tp];if(sz[tp]>sz[es[0].To])(children[cur][0],children[cur][ci])=(children[cur][ci],children[cur][0]);}if( ++ci(nodes,nxt,down,up);return op.Tree(nodes,root,hl);}static T[][]SizeToArray(int[]sizeArray,int offset=0,int root=-1){var a=new T[sizeArray.Length][];for(int i=0;i(this ITreeGraphtree,int u,int v)where TNode:ITreeNodewhere TEdge:IGraphEdge=>tree.HlDecomposition.LowestCommonAncestor(u,v);}} namespace Kzrnm.Competitive{public class HeavyLightDecompositionwhere TNode:ITreeNodewhere TEdge:IGraphEdge{public TNode[]tree;public int[]down;public int[]up;public int[]nxt;public HeavyLightDecomposition(TNode[]tree,int[]nxt,int[]down,int[]up){this.tree=tree;this.nxt=nxt;this.down=down;this.up=up;}[凾(256)]public(int From,int To)Index(int u)=>(down[u],up[u]);[凾(256)]public int LowestCommonAncestor(int u,int v){if(u==v)return u;var f=down[u]+1;var t=down[v]+1;if(tf)=>PathQuery(u,v,vertex,new FWrapper(f));[凾(256)]public void PathQuery(int u,int v,bool vertex,TOp f)where TOp:IHlDecompositionOperator{foreach(var(from,to)in new PathEnumerator(this,u,v,vertex))f.Operate(from,to);}[凾(256)]public void PathQuery(int u,int v,bool vertex,ref TOp f)where TOp:IHlDecompositionOperator{foreach(var(from,to)in new PathEnumerator(this,u,v,vertex))f.Operate(from,to);}[凾(256)]public void SubtreeQuery(int u,bool vertex,Actionf)=>SubtreeQuery(u,vertex,new FWrapper(f));[凾(256)]public void SubtreeQuery(int u,bool vertex,TOp f)where TOp:IHlDecompositionOperator=>f.Operate(down[u]+(vertex?0:1),up[u]);[凾(256)]public void SubtreeQuery(int u,bool vertex,ref TOp f)where TOp:IHlDecompositionOperator=>f.Operate(down[u]+(vertex?0:1),up[u]);private SparseTable<(int Depth,int Node),NodeMinOp>_lcaTable;private SparseTable<(int Depth,int Node),NodeMinOp>lcaTable=>_lcaTable??=BuildLcaTable();private SparseTable<(int Depth,int Node),NodeMinOp>BuildLcaTable(){var arr=new(int Depth,int Node)[down.Length];for(int i=0;i(arr);}private struct NodeMinOp:ISparseTableOperator<(int Depth,int Node)>{[凾(256)]public(int Depth,int Node)Operate((int Depth,int Node)x,(int Depth,int Node)y)=>x.Depth<=y.Depth?x:y;}private readonly struct FWrapper:IHlDecompositionOperator{private readonly Actionf;public FWrapper(Actionfunc){f=func;}[凾(256)]public void Operate(int u,int v)=>f(u,v);}private struct PathEnumerator{HeavyLightDecompositionhl;(int f,int t)_c;int u,v,lca;Stack<(int f,int t)>desc;St st;public PathEnumerator(HeavyLightDecompositionhl,int u,int v,bool vertex){lca=hl.LowestCommonAncestor(u,v);desc=BuildDesc(hl,lca,v);_c=default;this.hl=hl;this.u=u;this.v=lca;st=(St)(vertex?0b11:0b01);}public PathEnumerator GetEnumerator()=>this;static Stack<(int f,int t)>BuildDesc(HeavyLightDecompositionhl,int u,int v){var s=new Stack<(int f,int t)>();var tree=hl.tree;var nxt=hl.nxt;var down=hl.down;while(u!=v){if(nxt[u]==nxt[v]){s.Push((down[u]+1,down[v]+1));break;}else{s.Push((down[nxt[v]],down[v]+1));v=tree[nxt[v]].Parent.To;}}return s;}public(int f,int t)Current=>_c;public bool MoveNext(){var down=hl.down;var nxt=hl.nxt;if(u==v)goto Desc;if(st.HasFlag(St.Start))st&=~St.Start;else u=hl.tree[nxt[u]].Parent.To;if(nxt[u]!=nxt[v]){_c=(down[u]+1,down[nxt[u]]);return true;}if(u!=v){_c=(down[u]+1,down[v]+1);u=v;return true;}Desc:if(st.HasFlag(St.Vertex)){st&=~St.Vertex;var r=hl.down[lca];_c=(r,r+1);return true;}return desc.TryPop(out _c);}[Flags]enum St:byte{Start=1,Vertex=0b10,}}}public interface IHlDecompositionOperator{void Operate(int f,int t);}} namespace Kzrnm.Competitive{public static class 全方位木DP{[凾(256)]public static ImplRerooting(this ITreeGraphtree)where TNode:ITreeNodewhere TEdge:IGraphEdge=>new Impl(tree);public readonly struct Implwhere TNode:ITreeNodewhere TEdge:IGraphEdge{public Impl(ITreeGraphtree){Tree=tree;}private readonly ITreeGraphTree;public T[]Run(TOp op=default)where TOp:struct,IRerootingOperator{var tree=Tree.AsArray();var memo=new T[tree.Length];var dp=new T[tree.Length];{var idx=Tree.DfsDescendant();for(int i=idx.Length-1;i>=0;i--){var ix=idx[i];memo[ix]=op.Identity;foreach(var e in tree[ix].Children)memo[ix]=op.Merge(memo[ix],op.Propagate(memo[e.To],ix,e));}}{var stack=new Stack<(int Current,T Prev)>();stack.Push((Tree.Root,op.Identity));while(stack.TryPop(out var tuple)){var(cur,pval)=tuple;var edges=tree[cur].Children;var buf=new T[edges.Length];for(int i=0;i=0;i--)tail[i]=op.Merge(tail[i+1],buf[i]);dp[cur]=op.Merge(pval,head[^1]);for(int i=0;iwhere TEdge:IGraphEdge{T Identity{get;}T Merge(T x,T y);T Propagate(T x,int parent,TEdge edge);}} namespace Kzrnm.Competitive{public static class 木の探索{[凾(256)]public static int[]BfsDescendant(this ITreeGraphtree)where TNode:ITreeNodewhere TEdge:IGraphEdge{var arr=tree.AsArray();var res=new int[arr.Length];res[0]=tree.Root;int tar=1;int cur=0;while((uint)tar<(uint)res.Length){foreach(var e in arr[res[cur++]].Children)res[tar++]=e.To;}return res;}[凾(256)]public static int[]DfsDescendant(this ITreeGraphtree)where TNode:ITreeNodewhere TEdge:IGraphEdge{var down=tree.HlDecomposition.down;var res=new int[down.Length];for(int i=0;i