#ifndef AFDS_WEIGHTED_DSU
#define AFDS_WEIGHTED_DSU
#include<numeric>
#include<vector>template<classT>structWeightedDSU{std::vector<int>fa;std::vector<T>w;WeightedDSU(intn):fa(n+1),w(n+1){std::iota(fa.begin(),fa.end(),0);}inlineintfind(intx){if(fa[x]==x)returnx;intf=fa[x],f2=find(f);returnw[x]+=w[f],fa[x]=f2;}inlineboolsame(intx,inty){returnfind(x)==find(y);}// Given info: a[x] + v = a[y]// Returns true if this operation has no conflict, false otherwise.inlineboolmerge(intx,inty,Tv){intfx=find(x),fy=find(y);if(fx==fy){returnw[x]+v==w[y];}w[fy]=w[x]+v-w[y],fa[fy]=fx;returntrue;}inlineTdistance(intx,inty){returnfind(x),find(y),w[y]-w[x];}};#endif // AFDS_WEIGHTED_DSU
#line 1 "src/alfred/data_structure/weighted-dsu.hpp"
#include<numeric>
#include<vector>template<classT>structWeightedDSU{std::vector<int>fa;std::vector<T>w;WeightedDSU(intn):fa(n+1),w(n+1){std::iota(fa.begin(),fa.end(),0);}inlineintfind(intx){if(fa[x]==x)returnx;intf=fa[x],f2=find(f);returnw[x]+=w[f],fa[x]=f2;}inlineboolsame(intx,inty){returnfind(x)==find(y);}// Given info: a[x] + v = a[y]// Returns true if this operation has no conflict, false otherwise.inlineboolmerge(intx,inty,Tv){intfx=find(x),fy=find(y);if(fx==fy){returnw[x]+v==w[y];}w[fy]=w[x]+v-w[y],fa[fy]=fx;returntrue;}inlineTdistance(intx,inty){returnfind(x),find(y),w[y]-w[x];}};