library

This documentation is automatically generated by online-judge-tools/verification-helper

View the Project on GitHub tko919/library

:heavy_check_mark: Persistent Union Find
(DataStructure/persistentunionfind.hpp)

Depends on

Verified with

Code

#pragma once
#include "DataStructure/persistentarray.hpp"


struct PersistentUnionFind{
    PersistentArray<int> dat;
    PersistentUnionFind(int n){
        rep(i,0,n)dat.set(i,-1);
    }
    int root(int x){
        if(dat.get(x)<0)return x;
        else return root(dat.get(x));
    }
    bool unite(int x,int y){
        x=root(x),y=root(y);
        if(x==y)return false;
        int p=dat.get(x),q=dat.get(y);
        if(p>q)swap(x,y);
        dat.set(x,p+q);
        dat.set(y,x);
        return true;
    }
    bool same(int x,int y){return root(x)==root(y);}
    int size(int a){return -dat.get(root(a));}
};

/**
 * @brief Persistent Union Find
 */
#line 2 "DataStructure/persistentarray.hpp"

template<typename T,int B=4>class PersistentArray{
    const int M=(1<<B)-1;
    struct Node{
        Node *cp[1<<B]={};
        T val;
    };
    Node* set(int i,T x,Node* a){
        Node *ret=new Node();
        if(a){
            memcpy(ret->cp,a->cp,sizeof(a->cp));
            ret->val=a->val;
        }
        if(i)ret->cp[i&M]=set(i>>B,x,ret->cp[i&M]);
        else ret->val=x;
        return ret;
    }
    T get(int i,Node* a){
        if(i)return get(i>>B,a->cp[i&M]);
        else return a->val;
    }
public:
    Node *root;
    PersistentArray(Node* _r=nullptr):root(_r){}
    void set(int i,T x){
        root=set(i,x,root);
    }
    T get(int i){
        return get(i,root);
    }
};

/**
 * @brief Persistent Array
 */
#line 3 "DataStructure/persistentunionfind.hpp"

struct PersistentUnionFind{
    PersistentArray<int> dat;
    PersistentUnionFind(int n){
        rep(i,0,n)dat.set(i,-1);
    }
    int root(int x){
        if(dat.get(x)<0)return x;
        else return root(dat.get(x));
    }
    bool unite(int x,int y){
        x=root(x),y=root(y);
        if(x==y)return false;
        int p=dat.get(x),q=dat.get(y);
        if(p>q)swap(x,y);
        dat.set(x,p+q);
        dat.set(y,x);
        return true;
    }
    bool same(int x,int y){return root(x)==root(y);}
    int size(int a){return -dat.get(root(a));}
};

/**
 * @brief Persistent Union Find
 */
Back to top page