:warning: dsu/UF_data.hpp

Code

template<typename T,typename F>
class UF_data{
    public:
    vector<int> data;
    vector<T>val;
    int sz;
    F merge;
	public:
    UF_data(int sz,F merge=F()):sz(sz),merge(merge){data.resize(sz,-1);val.resize(sz,T());}
    bool unite(int x,int y){
        x=root(x);y=root(y);
        if(x==y)return 0;
        if(data[x]>data[y])swap(x,y);
		data[x]+=data[y];
		data[y]=x;
        val[x]=merge(move(val[x]),move(val[y]));
		sz--;
        return 1;
    }
    inline void set(int x,const T&v){
        x=root(x);
        val[x]=v;
    }
    template<typename G>
    void apply(int x,G g=G()){
        x=root(x);
        g(val[x]);
    }
    inline T& get(int x){
        return val[root(x)];
    }
    inline int root(int x){return data[x]<0?x:data[x]=root(data[x]);}
    inline bool same(int x, int y){return root(x)==root(y);}
    inline int size(){return sz;}
	inline int size(int x){return -data[root(x)];}
};
#line 1 "dsu/UF_data.hpp"
template<typename T,typename F>
class UF_data{
    public:
    vector<int> data;
    vector<T>val;
    int sz;
    F merge;
	public:
    UF_data(int sz,F merge=F()):sz(sz),merge(merge){data.resize(sz,-1);val.resize(sz,T());}
    bool unite(int x,int y){
        x=root(x);y=root(y);
        if(x==y)return 0;
        if(data[x]>data[y])swap(x,y);
		data[x]+=data[y];
		data[y]=x;
        val[x]=merge(move(val[x]),move(val[y]));
		sz--;
        return 1;
    }
    inline void set(int x,const T&v){
        x=root(x);
        val[x]=v;
    }
    template<typename G>
    void apply(int x,G g=G()){
        x=root(x);
        g(val[x]);
    }
    inline T& get(int x){
        return val[root(x)];
    }
    inline int root(int x){return data[x]<0?x:data[x]=root(data[x]);}
    inline bool same(int x, int y){return root(x)==root(y);}
    inline int size(){return sz;}
	inline int size(int x){return -data[root(x)];}
};
Back to top page