// codesnip-guard: tree_diameter #[cfg_attr(any(),rustfmt::skip)]mod tree_diameter{use super::{EdgeListGraph,XorLinkedRootedTree,Zero};impl EdgeListGraph{#[doc=" `(diameter, vertex_path)` for a nonempty undirected tree; `weight` maps edge IDs to nonnegative values."]pub fn tree_diameter(&self,weight:impl Fn(&usize)->T)->(T,Vec)where T:Clone+Ord+Zero+std::ops::Add{let n=self.vertices_size();let mut parent=vec![!0;n];let mut farthest:Vec<_>=(0..n).map(|u|(T::zero(),u)).collect();let(mut diameter,mut left,mut right,mut center)=(T::zero(),0,0,0);XorLinkedRootedTree::builder(n).with_eindexed().run(0,self.edges().copied(),|u,p,e|{parent[u]=p;let distance=farthest[u].0 .clone()+weight(&e);let candidate=distance.clone()+farthest[p].0 .clone();if diameter}impl EdgeListGraph{#[doc=" Construct empty graph."]pub fn new(vsize:usize)->Self{Self{vsize,edges:Vec::new()}}#[doc=" Return the number of vertices."]pub fn vertices_size(&self)->usize{self.vsize}#[doc=" Return the number of edges."]pub fn edges_size(&self)->usize{self.edges.len()}#[doc=" Return an iterator over graph vertices."]pub fn vertices(&self)->Range{0..self.vertices_size()}pub fn edges(&self)->Iter<'_,(usize,usize)>{self.edges.iter()}#[doc=" Construct graph from edges."]pub fn from_edges(vsize:usize,edges:Vec<(usize,usize)>)->Self{Self{vsize,edges}}}impl std::ops::Indexfor EdgeListGraph{type Output=(usize,usize);fn index(&self,index:usize)->&Self::Output{&self.edges[index]}}pub struct EdgeListGraphScanner,T:Scan>{vsize:usize,esize:usize,_marker:PhantomData(U,T)>}impl,T:Scan>EdgeListGraphScanner{pub fn new(vsize:usize,esize:usize)->Self{Self{vsize,esize,_marker:PhantomData}}}impl,T:Scan>MarkedScan for EdgeListGraphScanner{type Output=(EdgeListGraph,Vec<::Output>);fn mscan(self,iter:&mut I)->Option{let mut edges=Vec::with_capacity(self.esize);let mut rest=Vec::with_capacity(self.esize);for _ in 0..self.esize{edges.push((U::scan(iter)?,U::scan(iter)?));rest.push(T::scan(iter)?);}let graph=EdgeListGraph::from_edges(self.vsize,edges);Some((graph,rest))}}} // codesnip-guard: XorLinkedRootedTree #[cfg_attr(any(),rustfmt::skip)]pub use self::xor_linked_tree::*;#[cfg_attr(any(),rustfmt::skip)]mod xor_linked_tree{use super::{MarkedScan,Scan,ScanSource};use std::{marker::PhantomData,ops::Range};type Marker=PhantomDataT>;type BuilderMarker=Marker<((P,D,H),(PE,EC),(X,B,E))>;type ScannerMarker=Marker<((U,T),(P,D,H),(PE,EC),(X,B,E))>;#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoParent{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum RecordParent{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoDfsPreorder{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum RecordDfsPreorder{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoDepth{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum RecordDepth{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoParentEdge{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum RecordParentEdge{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoEdgeChild{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum RecordEdgeChild{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoEIndexed{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum EIndexed{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum NoXorBottomUpOrder{}#[derive(Clone,Copy,Debug,Eq,PartialEq,Ord,PartialOrd,Hash)]pub enum RecordXorBottomUpOrder{}pub trait ParentComponent{type Data;fn build(parent:Vec)->Self::Data;}impl ParentComponent for NoParent{type Data=();fn build(_parent:Vec){}}impl ParentComponent for RecordParent{type Data=Vec;fn build(parent:Vec)->Vec{parent}}pub trait XorBottomUpOrderBuffer{type Data;fn new(n:usize)->Self::Data;fn push(data:&mut Self::Data,v:usize);fn as_slice(data:&Self::Data)->&[usize];}impl XorBottomUpOrderBuffer for NoXorBottomUpOrder{type Data=();fn new(_n:usize){}fn push(_data:&mut Self::Data,_v:usize){}fn as_slice(_data:&Self::Data)->&[usize]{&[]}}impl XorBottomUpOrderBuffer for RecordXorBottomUpOrder{type Data=Vec;fn new(n:usize)->Vec{Vec::with_capacity(n.saturating_sub(1))}fn push(data:&mut Vec,v:usize){data.push(v);}fn as_slice(data:&Vec)->&[usize]{data}}pub trait XorBottomUpOrderComponent{type Data;}impl XorBottomUpOrderComponent for NoXorBottomUpOrder{type Data=();}impl XorBottomUpOrderComponent for RecordXorBottomUpOrder{type Data=Vec;}pub trait BuildXorBottomUpOrder:XorBottomUpOrderComponent where B:XorBottomUpOrderBuffer{fn build(buffer:B::Data)->Self::Data;}implBuildXorBottomUpOrderfor NoXorBottomUpOrder where B:XorBottomUpOrderBuffer{fn build(_buffer:B::Data){}}impl BuildXorBottomUpOrderfor RecordXorBottomUpOrder{fn build(buffer:Vec)->Vec{buffer}}#[derive(Debug)]pub struct DfsPreorder{order:Vec,preorder_index:Vec,subtree_end:Vec}pub trait DfsPreorderComponent{type Data;fn build(n:usize,root:usize,parent:&[usize],xor_order:&[usize])->Self::Data;}impl DfsPreorderComponent for NoDfsPreorder{type Data=();fn build(_n:usize,_root:usize,_parent:&[usize],_xor_order:&[usize]){}}impl DfsPreorderComponent for RecordDfsPreorder{type Data=DfsPreorder;fn build(n:usize,root:usize,parent:&[usize],xor_order:&[usize])->DfsPreorder{let mut preorder_index=vec![1usize;n];for&v in xor_order{preorder_index[parent[v]]+=preorder_index[v];}let mut subtree_end=vec![0usize;n];if n!=0{subtree_end[root]=n;}for&v in xor_order.iter().rev(){let p=parent[v];let size=preorder_index[v];let r=preorder_index[p];subtree_end[v]=r;preorder_index[v]=r;preorder_index[p]=r-size;}for i in&mut preorder_index{*i-=1;}let mut order=vec![0usize;n];for v in 0..n{order[preorder_index[v]]=v;}DfsPreorder{order,preorder_index,subtree_end}}}pub trait DepthComponent{type Data;fn build(n:usize,root:usize,parent:&[usize],xor_order:&[usize])->Self::Data;}impl DepthComponent for NoDepth{type Data=();fn build(_n:usize,_root:usize,_parent:&[usize],_xor_order:&[usize]){}}impl DepthComponent for RecordDepth{type Data=Vec;fn build(n:usize,_root:usize,parent:&[usize],xor_order:&[usize])->Vec{let mut depth=vec![0usize;n];for&v in xor_order.iter().rev(){depth[v]=depth[parent[v]]+1;}depth}}pub trait ParentEdgeComponent{type Data;fn build(parent_edge:Vec)->Self::Data;}impl ParentEdgeComponent for NoParentEdge{type Data=();fn build(_parent_edge:Vec){}}impl ParentEdgeComponent for RecordParentEdge{type Data=Vec;fn build(parent_edge:Vec)->Vec{parent_edge}}pub trait EdgeChildComponent{type Data;fn new(m:usize)->Self::Data;fn set(data:&mut Self::Data,eid:usize,child:usize);}impl EdgeChildComponent for NoEdgeChild{type Data=();fn new(_m:usize){}fn set(_data:&mut Self::Data,_eid:usize,_child:usize){}}impl EdgeChildComponent for RecordEdgeChild{type Data=Vec;fn new(m:usize)->Vec{vec![0usize;m]}fn set(data:&mut Vec,eid:usize,child:usize){data[eid]=child;}}pub struct XorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,X:XorBottomUpOrderComponent{n:usize,root:usize,parent:P::Data,dfs:D::Data,depth:H::Data,parent_edge:PE::Data,edge_child:EC::Data,xor_order:X::Data,_marker:Marker<(P,D,H,PE,EC,X)>}pub struct XorLinkedRootedTreeBuilder{n:usize,_marker:BuilderMarker}impl XorLinkedRootedTree{pub fn builder(n:usize)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n,_marker:PhantomData}}}implXorLinkedRootedTreeBuilder{pub fn with_parent(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}pub fn with_dfs_preorder(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}pub fn with_depth(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}pub fn with_xor_bottom_up_order(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}}implXorLinkedRootedTreeBuilder{pub fn with_eindexed(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}}implXorLinkedRootedTreeBuilder{pub fn with_parent_edge(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}pub fn with_edge_child(self)->XorLinkedRootedTreeBuilder{XorLinkedRootedTreeBuilder{n:self.n,_marker:PhantomData}}}implXorLinkedRootedTreeBuilderwhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{#[doc=" Builds a tree rooted at 0. The `n - 1` parents are in vertex order,"]#[doc=" and the parent of vertex `v` must be less than `v`."]pub fn build_from_ordered_parents(self,parents:impl IntoIterator)->XorLinkedRootedTree{let mut parent=Vec::with_capacity(self.n);if self.n!=0{parent.push(usize::MAX);}parent.extend(parents);assert_eq!(parent.len(),self.n);let mut order=B::new(self.n);for v in(1..self.n).rev(){B::push(&mut order,v);}finish_rooted_tree::(0,parent,order)}pub fn build(self,root:usize,edges:I)->XorLinkedRootedTreewhere I:IntoIterator{let mut acc=XorAccumulator::new(self.n);for(u,v)in edges{acc.add_edge(u,v);}finish_accumulator::(self.n,root,acc)}}implXorLinkedRootedTreeBuilderwhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{pub fn build(self,root:usize,edges:I)->XorLinkedRootedTreewhere I:IntoIterator{let mut acc=XorEIndexedAccumulator::new(self.n);for(eid,(u,v))in edges.into_iter().enumerate(){acc.add_edge(eid,u,v);}finish_eindexed_accumulator::(self.n,root,acc)}}impl XorLinkedRootedTreeBuilder{pub fn run(self,root:usize,edges:I,f:F)where I:IntoIterator,F:FnMut(usize,usize){let mut acc=XorAccumulator::new(self.n);for(u,v)in edges{acc.add_edge(u,v);}let mut order=();acc.finish::(root,&mut order,f);}}impl XorLinkedRootedTreeBuilder{pub fn run(self,root:usize,edges:I,f:F)where I:IntoIterator,F:FnMut(usize,usize,usize){let mut acc=XorEIndexedAccumulator::new(self.n);for(eid,(u,v))in edges.into_iter().enumerate(){acc.add_edge(eid,u,v);}let mut order=();let mut edge_child=();acc.finish::(root,&mut order,&mut edge_child,f);}}implXorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,O:XorBottomUpOrderComponent{pub fn vertices_size(&self)->usize{self.n}pub fn edges_size(&self)->usize{self.n.saturating_sub(1)}pub fn root(&self)->usize{self.root}}implXorLinkedRootedTreewhere D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,O:XorBottomUpOrderComponent{pub fn parent(&self,v:usize)->usize{self.parent[v]}pub fn parents(&self)->&[usize]{&self.parent}}implXorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent{#[doc=" Returns the bottom-up XOR order, excluding the root."]pub fn xor_bottom_up_order(&self)->&[usize]{&self.xor_order}#[doc=" Returns the top-down XOR order, excluding the root."]pub fn xor_top_down_order(&self)->impl DoubleEndedIterator+ExactSizeIterator+'_{self.xor_order.iter().rev().copied()}}implXorLinkedRootedTreewhere P:ParentComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,O:XorBottomUpOrderComponent{pub fn dfs_order(&self)->&[usize]{&self.dfs.order}pub fn dfs_index(&self,v:usize)->usize{self.dfs.preorder_index[v]}pub fn subtree_size(&self,v:usize)->usize{self.dfs.subtree_end[v]-self.dfs.preorder_index[v]}pub fn subtree_range(&self,v:usize)->Range{self.dfs.preorder_index[v]..self.dfs.subtree_end[v]}pub fn children(&self,v:usize)->Children<'_>{Children{dfs:&self.dfs,next:self.dfs.preorder_index[v]+1,end:self.dfs.subtree_end[v]}}}implXorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,O:XorBottomUpOrderComponent{pub fn depth(&self,v:usize)->usize{self.depth[v]}pub fn depths(&self)->&[usize]{&self.depth}}implXorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,EC:EdgeChildComponent,O:XorBottomUpOrderComponent{pub fn parent_edge(&self,v:usize)->usize{self.parent_edge[v]}pub fn parent_edges(&self)->&[usize]{&self.parent_edge}}implXorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,O:XorBottomUpOrderComponent{pub fn edge_child(&self,eid:usize)->usize{self.edge_child[eid]}pub fn edge_children(&self)->&[usize]{&self.edge_child}}pub struct Children<'a>{dfs:&'a DfsPreorder,next:usize,end:usize}impl Iterator for Children<'_>{type Item=usize;fn next(&mut self)->Option{if self.next==self.end{None}else{let v=self.dfs.order[self.next];self.next=self.dfs.subtree_end[v];Some(v)}}}pub struct XorLinkedRootedTreeScannerwhere U:Scan,T:Scan{n:usize,root:usize,_marker:ScannerMarker}implXorLinkedRootedTreeScannerwhere U:Scan,T:Scan{pub fn new(n:usize,root:usize)->Self{Self{n,root,_marker:PhantomData}}}implXorLinkedRootedTreeScannerwhere U:Scan,T:Scan{pub fn with_parent(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}pub fn with_dfs_preorder(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}pub fn with_depth(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}pub fn with_xor_bottom_up_order(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}}implXorLinkedRootedTreeScannerwhere U:Scan,T:Scan{pub fn with_eindexed(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}}implXorLinkedRootedTreeScannerwhere U:Scan,T:Scan{pub fn with_parent_edge(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}pub fn with_edge_child(self)->XorLinkedRootedTreeScanner{XorLinkedRootedTreeScanner{n:self.n,root:self.root,_marker:PhantomData}}}implMarkedScan for XorLinkedRootedTreeScannerwhere U:Scan,T:Scan,P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{type Output=(XorLinkedRootedTree,Vec<::Output>);fn mscan(self,iter:&mut I)->Option{let mut acc=XorAccumulator::new(self.n);let mut weights=Vec::with_capacity(self.n.saturating_sub(1));for _ in 0..self.n.saturating_sub(1){let u=U::scan(iter)?;let v=U::scan(iter)?;acc.add_edge(u,v);weights.push(T::scan(iter)?);}Some((finish_accumulator::(self.n,self.root,acc),weights))}}implMarkedScan for XorLinkedRootedTreeScannerwhere U:Scan,T:Scan,P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{type Output=(XorLinkedRootedTree,Vec<::Output>);fn mscan(self,iter:&mut I)->Option{let mut acc=XorEIndexedAccumulator::new(self.n);let mut weights=Vec::with_capacity(self.n.saturating_sub(1));for eid in 0..self.n.saturating_sub(1){let u=U::scan(iter)?;let v=U::scan(iter)?;acc.add_edge(eid,u,v);weights.push(T::scan(iter)?);}Some((finish_eindexed_accumulator::(self.n,self.root,acc),weights))}}fn finish_accumulator(n:usize,root:usize,acc:XorAccumulator)->XorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{let mut xor_order=B::new(n);let parent=acc.finish::(root,&mut xor_order,|_,_|{});finish_rooted_tree::(root,parent,xor_order)}fn finish_rooted_tree(root:usize,parent:Vec,xor_order:B::Data)->XorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{let n=parent.len();let order=B::as_slice(&xor_order);let dfs=D::build(n,root,&parent,order);let depth=H::build(n,root,&parent,order);XorLinkedRootedTree{n,root,parent:P::build(parent),dfs,depth,parent_edge:(),edge_child:(),xor_order:X::build(xor_order),_marker:PhantomData}}fn finish_eindexed_accumulator(n:usize,root:usize,acc:XorEIndexedAccumulator)->XorLinkedRootedTreewhere P:ParentComponent,D:DfsPreorderComponent,H:DepthComponent,PE:ParentEdgeComponent,EC:EdgeChildComponent,X:BuildXorBottomUpOrder,B:XorBottomUpOrderBuffer{let mut xor_order=B::new(n);let mut edge_child=EC::new(n.saturating_sub(1));let(parent,parent_edge)=acc.finish::(root,&mut xor_order,&mut edge_child,|_,_,_|{});let order=B::as_slice(&xor_order);let dfs=D::build(n,root,&parent,order);let depth=H::build(n,root,&parent,order);XorLinkedRootedTree{n,root,parent:P::build(parent),dfs,depth,parent_edge:PE::build(parent_edge),edge_child,xor_order:X::build(xor_order),_marker:PhantomData}}struct XorAccumulator{deg:Vec,xor:Vec}impl XorAccumulator{fn new(n:usize)->Self{Self{deg:vec![0;n],xor:vec![0;n]}}fn add_edge(&mut self,u:usize,v:usize){self.deg[u]+=1;self.deg[v]+=1;self.xor[u]^=v;self.xor[v]^=u;}fn finish(mut self,root:usize,xor_order:&mut O::Data,mut f:F)->Vecwhere O:XorBottomUpOrderBuffer,F:FnMut(usize,usize){self.deg[root]=0;for i in 0..self.deg.len(){let mut v=i;while self.deg[v]==1{let p=self.xor[v];O::push(xor_order,v);f(v,p);self.deg[v]=0;self.deg[p]-=1;self.xor[p]^=v;v=p;}}self.xor[root]=usize::MAX;self.xor}}struct XorEIndexedAccumulator{deg:Vec,xor:Vec,edge_xor:Vec}impl XorEIndexedAccumulator{fn new(n:usize)->Self{Self{deg:vec![0;n],xor:vec![0;n],edge_xor:vec![0;n]}}fn add_edge(&mut self,eid:usize,u:usize,v:usize){self.deg[u]+=1;self.deg[v]+=1;self.xor[u]^=v;self.xor[v]^=u;self.edge_xor[u]^=eid;self.edge_xor[v]^=eid;}fn finish(mut self,root:usize,xor_order:&mut O::Data,edge_child:&mut EC::Data,mut f:F)->(Vec,Vec)where O:XorBottomUpOrderBuffer,EC:EdgeChildComponent,F:FnMut(usize,usize,usize){self.deg[root]=0;for i in 0..self.deg.len(){let mut v=i;while self.deg[v]==1{let p=self.xor[v];let e=self.edge_xor[v];O::push(xor_order,v);EC::set(edge_child,e,v);f(v,p,e);self.deg[v]=0;self.deg[p]-=1;self.xor[p]^=v;self.edge_xor[p]^=e;v=p;}}self.xor[root]=usize::MAX;self.edge_xor[root]=usize::MAX;(self.xor,self.edge_xor)}}} // codesnip-guard: array #[cfg_attr(any(),rustfmt::skip)]mod array{#[macro_export]macro_rules!array{[@inner$data:ident=[$init:expr;$len:expr]]=>{{use::std::mem::{ManuallyDrop,MaybeUninit};let mut$data:[MaybeUninit<_>;$len]=unsafe{MaybeUninit::uninit().assume_init()};$init;#[repr(C)]union __Transmuter{src:ManuallyDrop<[MaybeUninit;N]>,dst:ManuallyDrop<[T;N]>,}ManuallyDrop::into_inner(unsafe{__Transmuter{src:ManuallyDrop::new($data)}.dst})}};[||$e:expr;$len:expr]=>{$crate::array![@inner data=[data.iter_mut().for_each(|item|*item=MaybeUninit::new($e));$len]]};[|$i:pat_param|$e:expr;$len:expr]=>{$crate::array![@inner data=[data.iter_mut().enumerate().for_each(|($i,item)|*item=MaybeUninit::new($e));$len]]};[$e:expr;$len:expr]=>{{let e=$e;$crate::array![||Clone::clone(&e);$len]}};}} // codesnip-guard: scanner #[cfg_attr(any(),rustfmt::skip)]pub use self::scanner::*;#[cfg_attr(any(),rustfmt::skip)]mod scanner{use std::{iter::{FromIterator,from_fn,repeat_with},marker::PhantomData};pub fn read_stdin_all()->String{use std::io::Read as _;let mut s=String::new();std::io::stdin().read_to_string(&mut s).expect("io error");s}pub fn read_stdin_all_unchecked()->String{use std::io::Read as _;let mut buf=Vec::new();std::io::stdin().read_to_end(&mut buf).expect("io error");unsafe{String::from_utf8_unchecked(buf)}}pub fn read_all(mut reader:impl std::io::Read)->String{let mut s=String::new();reader.read_to_string(&mut s).expect("io error");s}pub fn read_all_unchecked(mut reader:impl std::io::Read)->String{let mut buf=Vec::new();reader.read_to_end(&mut buf).expect("io error");unsafe{String::from_utf8_unchecked(buf)}}pub fn read_stdin_line()->String{let mut s=String::new();std::io::stdin().read_line(&mut s).expect("io error");s}pub trait Scan:Sized{type Output;fn scan(source:&mut S)->Option;fn scan_vec(source:&mut S,size:usize,capacity:usize)->Vec{let mut values=Vec::with_capacity(capacity.max(size));values.extend((0..size).map(|_|source.scan::()));values}}pub trait MarkedScan:Sized{type Output;fn mscan(self,source:&mut S)->Option;}pub trait ScanSource:Sized{#[doc=" Reads a token under the source's input requirements."]#[doc=" Checked sources return `None` at EOF; unchecked sources require available input."]fn next_token(&mut self)->Option<&str>;#[doc=" Skips separators without consuming the next token."]#[inline]fn skip_whitespace(&mut self){}#[inline]fn read_u8(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_u16(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_u32(&mut self)->Option{self.next_token()?.parse().ok()}fn read_u32_vec(&mut self,size:usize,capacity:usize)->Vec{let mut values=Vec::with_capacity(capacity.max(size));values.extend((0..size).map(|_|self.scan::()));values}#[inline]fn read_u64(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_u128(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_usize(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i8(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i16(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i32(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i64(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_i128(&mut self)->Option{self.next_token()?.parse().ok()}#[inline]fn read_isize(&mut self)->Option{self.next_token()?.parse().ok()}#[doc=" Panics if reading fails."]#[inline]fn scan(&mut self)->T::Output{T::scan(self).expect("scan error")}#[doc=" Panics if reading fails."]#[inline]fn mscan(&mut self,marker:T)->T::Output{marker.mscan(self).expect("scan error")}fn scan_vec(&mut self,size:usize,capacity:usize)->Vec{if size==0{self.skip_whitespace();}T::scan_vec(self,size,capacity)}#[inline]fn iter(&mut self)->ScannerIter<'_,Self,T>{ScannerIter{inner:self,_marker:PhantomData}}}#[derive(Clone,Debug)]pub struct Scanner<'a,I:Iterator=std::str::SplitAsciiWhitespace<'a>>{iter:I}impl<'a>Scanner<'a>{pub fn new(s:&'a str)->Self{Self{iter:s.split_ascii_whitespace()}}}impl<'a,I:Iterator>Scanner<'a,I>{pub fn new_from_iter(iter:I)->Self{Self{iter}}}impl<'a,I:Iterator>ScanSource for Scanner<'a,I>{fn next_token(&mut self)->Option<&str>{self.iter.next()}}macro_rules!impl_scan{($($t:ty)*)=>{$(impl Scan for$t{type Output=Self;fn scan(iter:&mut I)->Option{iter.next_token()?.parse::<$t>().ok()}})*};}impl_scan!(char f32 f64 String);macro_rules!impl_integer_scan{($($t:ty=>$read:ident),*$(,)?)=>{$(impl Scan for$t{type Output=Self;#[inline]fn scan(source:&mut S)->Option{source.$read()}})*};}impl_integer_scan!(u8=>read_u8,u16=>read_u16,u64=>read_u64,u128=>read_u128,usize=>read_usize,i8=>read_i8,i16=>read_i16,i32=>read_i32,i64=>read_i64,i128=>read_i128,isize=>read_isize,);impl Scan for u32{type Output=Self;#[inline]fn scan(source:&mut S)->Option{source.read_u32()}fn scan_vec(source:&mut S,size:usize,capacity:usize)->Vec{source.read_u32_vec(size,capacity)}}macro_rules!impl_scan_tuple{(@impl$($T:ident)*)=>{impl<$($T:Scan),*>Scan for($($T,)*){type Output=($(<$T as Scan>::Output,)*);fn scan(_iter:&mut It)->Option{Some(($(<$T as Scan>::scan(_iter)?,)*))}}};(@inner$($T:ident)*,)=>{impl_scan_tuple!(@impl$($T)*);};(@inner$($T:ident)*,$U:ident$($Rest:ident)*)=>{impl_scan_tuple!(@impl$($T)*);impl_scan_tuple!(@inner$($T)*$U,$($Rest)*);};($($T:ident)*)=>{impl_scan_tuple!(@inner,$($T)*);};}impl_scan_tuple!(A B C D E F G H I J K);pub struct ScannerIter<'a,S,T>{inner:&'a mut S,_marker:PhantomDataT>}implIterator for ScannerIter<'_,S,T>{type Item=T::Output;#[inline]fn next(&mut self)->Option{T::scan(self.inner)}}#[doc=" scan a value with Scanner"]#[doc=""]#[doc=" - `scan_value!(scanner, ELEMENT)`"]#[doc=""]#[doc=" ELEMENT :="]#[doc=" - `$ty`: Scan"]#[doc=" - `&str`: borrowed token; the source stays borrowed until its last use"]#[doc=" - `@$expr`: MarkedScan"]#[doc=" - `$ty = $expr`: MarkedScan"]#[doc=" - `[ELEMENT; $expr]`: vector"]#[doc=" - `[$ty; $len; capacity $capacity]`: vector with reserved capacity"]#[doc=" - `[ELEMENT; const $expr]`: array"]#[doc=" - `[ELEMENT]`: iterator"]#[doc=" - `[ELEMENT; iter $expr]`: iterator of the specified length"]#[doc=" - `($(ELEMENT)*,)`: tuple"]#[macro_export]macro_rules!scan_value{(@repeat$scanner:expr,[$($t:tt)*]$len:expr)=>{{$crate::scan_value!(@iter$scanner,[$($t)*]$len).collect::>()}};(@repeat$scanner:expr,[$($t:tt)*])=>{{::std::iter::repeat_with(||$crate::scan_value!(@inner$scanner,[]$($t)*))}};(@iter$scanner:expr,[$($t:tt)*]$len:expr)=>{{let size=$len;if size==0{$scanner.skip_whitespace();}$crate::scan_value!(@repeat$scanner,[$($t)*]).take(size)}};(@array$scanner:expr,[$($t:tt)*]$len:expr)=>{{if$len==0{$scanner.skip_whitespace();}$crate::array![||$crate::scan_value!(@inner$scanner,[]$($t)*);$len]}};(@tuple$scanner:expr,[$([$($args:tt)*])*])=>{($($($args)*,)*)};(@sparen$scanner:expr,[]@$e:expr;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[@$e]$($t)*)};(@sparen$scanner:expr,[]($($tt:tt)*);$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[($($tt)*)]$($t)*)};(@sparen$scanner:expr,[][$($tt:tt)*];$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[[$($tt)*]]$($t)*)};(@sparen$scanner:expr,[]$ty:ty=$e:expr;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[$ty=$e]$($t)*)};(@sparen$scanner:expr,[]$ty:ty;$($t:tt)*)=>{$crate::scan_value!(@sparen$scanner,[$ty]$($t)*)};(@sparen$scanner:expr,[]$($args:tt)*)=>{$crate::scan_value!(@repeat$scanner,[$($args)*])};(@sparen$scanner:expr,[$($args:tt)+]const$len:expr)=>{$crate::scan_value!(@array$scanner,[$($args)+]$len)};(@sparen$scanner:expr,[$($args:tt)+]iter$len:expr)=>{$crate::scan_value!(@iter$scanner,[$($args)+]$len)};(@sparen$scanner:expr,[$($args:tt)+]$len:expr;capacity$capacity:expr)=>{{let size=$len;let capacity=$capacity;$scanner.scan_vec::<$($args)+>(size,capacity)}};(@sparen$scanner:expr,[$($args:tt)+]$len:expr)=>{$crate::scan_value!(@repeat$scanner,[$($args)+]$len)};(@$tag:ident$scanner:expr,[[$($args:tt)*]])=>{$($args)*};(@$tag:ident$scanner:expr,[$($args:tt)*]@$e:expr$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.mscan($e)]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]($($tuple:tt)*)$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$crate::scan_value!(@tuple$scanner,[]$($tuple)*)]]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$crate::scan_value!(@sparen$scanner,[]$($tt)*)]]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*]&str$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.next_token().expect("scan error")]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[{let _tmp:$ty=$scanner.mscan($e);_tmp}]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::scan_value!(@$tag$scanner,[$($args)*[$scanner.scan::<$ty>()]]$(,$($t)*)?)};(@$tag:ident$scanner:expr,[$($args:tt)*],$($t:tt)*)=>{$crate::scan_value!(@$tag$scanner,[$($args)*]$($t)*)};(@$tag:ident$scanner:expr,[$($args:tt)*])=>{::std::compile_error!(::std::stringify!($($args)*))};(src=$src:expr,$($t:tt)*)=>{{let mut __scanner=Scanner::new($src);$crate::scan_value!(@inner __scanner,[]$($t)*)}};(iter=$iter:expr,$($t:tt)*)=>{{let mut __scanner=Scanner::new_from_iter($iter);$crate::scan_value!(@inner __scanner,[]$($t)*)}};($scanner:expr,$($t:tt)*)=>{$crate::scan_value!(@inner$scanner,[]$($t)*)}}#[doc=" scan and bind values with Scanner"]#[doc=""]#[doc=" - `scan!(scanner, $($pat $(: ELEMENT)?),*)`"]#[macro_export]macro_rules!scan{(@assert$p:pat)=>{};(@assert$($p:tt)*)=>{::std::compile_error!(::std::concat!("expected pattern, found `",::std::stringify!($($p)*),"`"));};(@pat$scanner:expr,[][])=>{};(@pat$scanner:expr,[][],$($t:tt)*)=>{$crate::scan!(@pat$scanner,[][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]$x:ident$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*$x][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]::$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*::][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]&$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*&][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]($($x:tt)*)$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*($($x)*)][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][][$($x:tt)*]$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*[$($x)*]][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]{$($x:tt)*}$($t:tt)*)=>{$crate::scan!(@pat$scanner,[$($p)*{$($x)*}][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]:$($t:tt)*)=>{$crate::scan!(@ty$scanner,[$($p)*][]$($t)*)};(@pat$scanner:expr,[$($p:tt)*][]$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][usize]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]@$e:expr$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*@$e]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]($($x:tt)*)$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*($($x)*)]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*][$($x:tt)*]$($t:tt)*)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*[$($x)*]]$($t)*)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]&str$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*&str]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*$ty=$e]$(,$($t)*)?)};(@ty$scanner:expr,[$($p:tt)*][$($tt:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::scan!(@let$scanner,[$($p)*][$($tt)*$ty]$(,$($t)*)?)};(@let$scanner:expr,[$($p:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::scan!{@assert$($p)*}let$($p)* =$crate::scan_value!($scanner,$($tt)*);$crate::scan!(@pat$scanner,[][]$($t)*)};(src=$src:expr,$($t:tt)*)=>{let mut __scanner=Scanner::new($src);$crate::scan!(@pat __scanner,[][]$($t)*)};(iter=$iter:expr,$($t:tt)*)=>{let mut __scanner=Scanner::new_from_iter($iter);$crate::scan!(@pat __scanner,[][]$($t)*)};($scanner:expr,$($t:tt)*)=>{$crate::scan!(@pat$scanner,[][]$($t)*)}}#[doc=" define enum scan rules"]#[doc=""]#[doc=" # Example"]#[doc=" ```rust"]#[doc=" # use competitive::{define_enum_scan, tools::{CharsWithBase, Scan, ScanSource, Scanner, Usize1}};"]#[doc=" define_enum_scan! {"]#[doc=" enum Query: u8 {"]#[doc=" 0 => Noop,"]#[doc=" 1 => Args { i: Usize1, s: char },"]#[doc=" 9 => Complex { n: usize, c: [(usize, Vec = CharsWithBase('a')); n] },"]#[doc=" }"]#[doc=" }"]#[doc=" ```"]#[macro_export]macro_rules!define_enum_scan{(@field_ty@repeat[$($t:tt)*]$($len:expr)?)=>{Vec<$crate::define_enum_scan!(@field_ty$($t)*)>};(@field_ty@array[$($t:tt)*]$len:expr)=>{[$crate::define_enum_scan!(@field_ty$($t)*);$len]};(@field_ty@tuple[$([$($args:tt)*])*])=>{($($($args)*,)*)};(@field_ty@sparen[]($($tt:tt)*);$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[($($tt)*)]$($t)*)};(@field_ty@sparen[][$($tt:tt)*];$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[[$($tt)*]]$($t)*)};(@field_ty@sparen[]$ty:ty=$e:expr;$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[$ty=$e]$($t)*)};(@field_ty@sparen[]$ty:ty;$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@sparen[$ty]$($t)*)};(@field_ty@sparen[]$($args:tt)*)=>{$crate::define_enum_scan!(@field_ty@repeat[$($args)*])};(@field_ty@sparen[$($args:tt)+]const$len:expr)=>{$crate::define_enum_scan!(@field_ty@array[$($args)+]$len)};(@field_ty@sparen[$($args:tt)+]$len:expr)=>{$crate::define_enum_scan!(@field_ty@repeat[$($args)+]$len)};(@field_ty@$tag:ident[$($args:tt)*]($($tuple:tt)*)$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$crate::define_enum_scan!(@field_ty@tuple[]$($tuple)*)]]$($t)*)};(@field_ty@$tag:ident[$($args:tt)*][$($tt:tt)*]$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$crate::define_enum_scan!(@field_ty@sparen[]$($tt)*)]]$($t)*)};(@field_ty@$tag:ident[$($args:tt)*]$ty:ty=$e:expr$(,$($t:tt)*)?)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[$ty]]$(,$($t)*)?)};(@field_ty@$tag:ident[$($args:tt)*]$ty:ty$(,$($t:tt)*)?)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*[<$ty as Scan>::Output]]$(,$($t)*)?)};(@field_ty@$tag:ident[$($args:tt)*],$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@$tag[$($args)*]$($t)*)};(@field_ty@$tag:ident[[$($args:tt)*]])=>{$($args)*};(@field_ty@$tag:ident[$($args:tt)*])=>{::std::compile_error!(::std::stringify!($($args)*))};(@field_ty$($t:tt)*)=>{$crate::define_enum_scan!(@field_ty@inner[]$($t)*)};(@tag_expr raw,$iter:ident)=>{ScanSource::next_token($iter)?};(@tag_expr$d:ty,$iter:ident)=>{<$d as Scan>::scan($iter)?};(@variant([$($attr:tt)*]$vis:vis$T:ident$d:tt)[$($vars:tt)*])=>{$crate::define_enum_scan!{@def$($attr)*$vis enum$T:$d{$($vars)*}}};(@variant$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident{$($fs:tt)*}$($rest:tt)*)=>{$crate::define_enum_scan!{@field$ctx[$($vars)*]$p=>$v[]$($fs)*;$($rest)*}};(@variant$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v,]$($rest)*}};(@variant$ctx:tt[$($vars:tt)*],$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*]$($rest)*}};(@endfield$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*][$f:ident:$($spec:tt)*],$($rest:tt)*)=>{$crate::define_enum_scan!{@field$ctx[$($vars)*]$p=>$v[$($fs)*[$f:$($spec)*]]$($rest)*}};(@endfield$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*][$f:ident:$($spec:tt)*];$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v{$($fs)*[$f:$($spec)*]},]$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*];$($rest:tt)*)=>{$crate::define_enum_scan!{@variant$ctx[$($vars)*$p=>$v{$($fs)*},]$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:($($tuple:tt)*)$sep:tt$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:($($tuple)*)]$sep$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:[$($x:tt)*]$sep:tt$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:[$($x)*]]$sep$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty=$e:expr,$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty=$e],$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty;$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty];$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty=$e:expr;$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty=$e];$($rest)*}};(@field$ctx:tt[$($vars:tt)*]$p:pat=>$v:ident[$($fs:tt)*]$f:ident:$ty:ty,$($rest:tt)*)=>{$crate::define_enum_scan!{@endfield$ctx[$($vars)*]$p=>$v[$($fs)*][$f:$ty],$($rest)*}};(@def$(#[$attr:meta])*$vis:vis enum$T:ident:$d:tt{$($p:pat=>$v:ident$({$([$f:ident:$($spec:tt)*])*})?,)*})=>{$(#[$attr])*$vis enum$T{$($v$({$($f:$crate::define_enum_scan!(@field_ty$($spec)*)),*})?),*}impl Scan for$T{type Output=Self;fn scan(iter:&mut I)->Option{let tag=$crate::define_enum_scan!(@tag_expr$d,iter);match tag{$($p=>{$($(let$f=$crate::scan_value!((*iter),$($spec)*);)*)?Some($T::$v$({$($f),*})?)}),*_=>None,}}}};($(#[$attr:meta])*$vis:vis enum$T:ident:raw{$($body:tt)*})=>{$crate::define_enum_scan!{@variant([$(#[$attr])*]$vis$T raw)[]$($body)*}};($(#[$attr:meta])*$vis:vis enum$T:ident:$d:ty{$($body:tt)*})=>{$crate::define_enum_scan!{@variant([$(#[$attr])*]$vis$T$d)[]$($body)*}};}#[derive(Debug,Copy,Clone)]pub enum Usize1{}impl Scan for Usize1{type Output=usize;fn scan(iter:&mut I)->Option{::scan(iter)?.checked_sub(1)}}#[derive(Debug,Copy,Clone)]pub struct CharWithBase(pub char);impl MarkedScan for CharWithBase{type Output=usize;fn mscan(self,iter:&mut I)->Option{Some((::scan(iter)?as u8-self.0 as u8)as usize)}}#[derive(Debug,Copy,Clone)]pub enum Chars{}impl Scan for Chars{type Output=Vec;fn scan(iter:&mut I)->Option{Some(iter.next_token()?.chars().collect())}}#[derive(Debug,Copy,Clone)]pub struct CharsWithBase(pub char);impl MarkedScan for CharsWithBase{type Output=Vec;fn mscan(self,iter:&mut I)->Option{Some(iter.next_token()?.chars().map(|c|(c as u8-self.0 as u8)as usize).collect())}}#[derive(Debug,Copy,Clone)]pub enum Byte1{}impl Scan for Byte1{type Output=u8;fn scan(iter:&mut I)->Option{let bytes=iter.next_token()?.as_bytes();assert_eq!(bytes.len(),1);Some(bytes[0])}}#[derive(Debug,Copy,Clone)]pub struct ByteWithBase(pub u8);impl MarkedScan for ByteWithBase{type Output=usize;fn mscan(self,iter:&mut I)->Option{Some((::scan(iter)?as u8-self.0)as usize)}}#[derive(Debug,Copy,Clone)]pub enum Bytes{}impl Scan for Bytes{type Output=Vec;fn scan(iter:&mut I)->Option{Some(iter.next_token()?.bytes().collect())}}#[derive(Debug,Copy,Clone)]pub struct BytesWithBase(pub u8);impl MarkedScan for BytesWithBase{type Output=Vec;fn mscan(self,iter:&mut I)->Option{Some(iter.next_token()?.bytes().map(|c|(c-self.0)as usize).collect())}}#[derive(Debug,Copy,Clone)]pub struct Collect::Output>>where T:Scan,B:FromIterator<::Output>{size:usize,_marker:PhantomData(T,B)>}implCollectwhere T:Scan,B:FromIterator<::Output>{pub fn new(size:usize)->Self{Self{size,_marker:PhantomData}}}implMarkedScan for Collectwhere T:Scan,B:FromIterator<::Output>{type Output=B;fn mscan(self,iter:&mut I)->Option{if self.size==0{iter.skip_whitespace();}repeat_with(| |::scan(iter)).take(self.size).collect()}}#[derive(Debug,Copy,Clone)]pub struct SizedCollect::Output>>where T:Scan,B:FromIterator<::Output>{_marker:PhantomData(T,B)>}implScan for SizedCollectwhere T:Scan,B:FromIterator<::Output>{type Output=B;fn scan(iter:&mut I)->Option{let size=usize::scan(iter)?;if size==0{iter.skip_whitespace();}repeat_with(| |::scan(iter)).take(size).collect()}}#[derive(Debug,Copy,Clone)]pub struct Splittedwhere T:Scan{pat:P,_marker:PhantomDataT>}implSplittedwhere T:Scan{pub fn new(pat:P)->Self{Self{pat,_marker:PhantomData}}}implMarkedScan for Splittedwhere T:Scan{type Output=Vec<::Output>;fn mscan(self,iter:&mut I)->Option{let mut iter=Scanner::new_from_iter(iter.next_token()?.split(self.pat));Some(from_fn(| |::scan(&mut iter)).collect())}}implMarkedScan for Splittedwhere T:Scan{type Output=Vec<::Output>;fn mscan(self,iter:&mut I)->Option{let mut iter=Scanner::new_from_iter(iter.next_token()?.split(self.pat));Some(from_fn(| |::scan(&mut iter)).collect())}}implMarkedScan for F where F:Fn(&str)->Option{type Output=T;fn mscan(self,iter:&mut I)->Option{self(iter.next_token()?)}}} // codesnip-guard: zero_one #[cfg_attr(any(),rustfmt::skip)]pub use self::zero_one::{One,Zero};#[cfg_attr(any(),rustfmt::skip)]mod zero_one{pub trait Zero:Sized{fn zero()->Self;#[inline]fn is_zero(&self)->bool where Self:PartialEq{self==&Self::zero()}#[inline]fn set_zero(&mut self){*self=Self::zero();}}pub trait One:Sized{fn one()->Self;#[inline]fn is_one(&self)->bool where Self:PartialEq{self==&Self::one()}#[inline]fn set_one(&mut self){*self=Self::one();}}macro_rules!impl_zero_one{($({$(<$T:ident:$Bound:ident>)?$Trait:ident$method:ident$($t:ty)*,$e:expr})*)=>{$(impl_zero_one!(@impl[$(<$T:$Bound>)?]$Trait$method[$($t)*],$e);)*};(@impl[<$T:ident:$Bound:ident>]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl<$T:$Bound>$Trait for$t{fn$method()->Self{$e}})*};(@impl[]$Trait:ident$method:ident[$($t:ty)*],$e:expr)=>{$(impl$Trait for$t{fn$method()->Self{$e}})*};}impl_zero_one!({Zero zero u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,0}{Zero zero f32 f64,0.}{One one u8 u16 u32 u64 usize i8 i16 i32 i64 isize u128 i128,1}{One one f32 f64,1.}{Zero zero std::num::Wrapping,Self(T::zero())}{One one std::num::Wrapping,Self(T::one())});}