compro-library

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

View the Project on GitHub ningenMe/compro-library

:heavy_check_mark: WordSizeTreeSet - 64分木
(lib/12-binary-search-tree/WordSizeTreeSet.cpp)

WordSizeTreeSet

reference

Verified with

Code

/*
 * @title WordSizeTreeSet - 64分木
 * @docs md/binary-search-tree/WordSizeTreeSet.md
 */
class WordSizeTreeSet {
public:
    using u64 = unsigned long long;
    inline static constexpr u64 max_length=(1ULL<<24);
private:
    inline static constexpr u64 word_size=(1ULL<<6);
    inline static constexpr array<u64,word_size> pow2 = {1ULL, 2ULL, 4ULL, 8ULL, 16ULL, 32ULL, 64ULL, 128ULL, 256ULL, 512ULL, 1024ULL, 2048ULL, 4096ULL, 8192ULL, 16384ULL, 32768ULL, 65536ULL, 131072ULL, 262144ULL, 524288ULL, 1048576ULL, 2097152ULL, 4194304ULL, 8388608ULL, 16777216ULL, 33554432ULL, 67108864ULL, 134217728ULL, 268435456ULL, 536870912ULL, 1073741824ULL, 2147483648ULL, 4294967296ULL, 8589934592ULL, 17179869184ULL, 34359738368ULL, 68719476736ULL, 137438953472ULL, 274877906944ULL, 549755813888ULL, 1099511627776ULL, 2199023255552ULL, 4398046511104ULL, 8796093022208ULL, 17592186044416ULL, 35184372088832ULL, 70368744177664ULL, 140737488355328ULL, 281474976710656ULL, 562949953421312ULL, 1125899906842624ULL, 2251799813685248ULL, 4503599627370496ULL, 9007199254740992ULL, 18014398509481984ULL, 36028797018963968ULL, 72057594037927936ULL, 144115188075855872ULL, 288230376151711744ULL, 576460752303423488ULL, 1152921504606846976ULL, 2305843009213693952ULL, 4611686018427387904ULL, 9223372036854775808ULL};
    inline static constexpr array<u64,word_size> next_lower_bound_mask = {18446744073709551615ULL, 18446744073709551614ULL, 18446744073709551612ULL, 18446744073709551608ULL, 18446744073709551600ULL, 18446744073709551584ULL, 18446744073709551552ULL, 18446744073709551488ULL, 18446744073709551360ULL, 18446744073709551104ULL, 18446744073709550592ULL, 18446744073709549568ULL, 18446744073709547520ULL, 18446744073709543424ULL, 18446744073709535232ULL, 18446744073709518848ULL, 18446744073709486080ULL, 18446744073709420544ULL, 18446744073709289472ULL, 18446744073709027328ULL, 18446744073708503040ULL, 18446744073707454464ULL, 18446744073705357312ULL, 18446744073701163008ULL, 18446744073692774400ULL, 18446744073675997184ULL, 18446744073642442752ULL, 18446744073575333888ULL, 18446744073441116160ULL, 18446744073172680704ULL, 18446744072635809792ULL, 18446744071562067968ULL, 18446744069414584320ULL, 18446744065119617024ULL, 18446744056529682432ULL, 18446744039349813248ULL, 18446744004990074880ULL, 18446743936270598144ULL, 18446743798831644672ULL, 18446743523953737728ULL, 18446742974197923840ULL, 18446741874686296064ULL, 18446739675663040512ULL, 18446735277616529408ULL, 18446726481523507200ULL, 18446708889337462784ULL, 18446673704965373952ULL, 18446603336221196288ULL, 18446462598732840960ULL, 18446181123756130304ULL, 18445618173802708992ULL, 18444492273895866368ULL, 18442240474082181120ULL, 18437736874454810624ULL, 18428729675200069632ULL, 18410715276690587648ULL, 18374686479671623680ULL, 18302628885633695744ULL, 18158513697557839872ULL, 17870283321406128128ULL, 17293822569102704640ULL, 16140901064495857664ULL, 13835058055282163712ULL, 9223372036854775808ULL};
    inline static constexpr array<u64,word_size> prev_lower_bound_mask = {1ULL, 3ULL, 7ULL, 15ULL, 31ULL, 63ULL, 127ULL, 255ULL, 511ULL, 1023ULL, 2047ULL, 4095ULL, 8191ULL, 16383ULL, 32767ULL, 65535ULL, 131071ULL, 262143ULL, 524287ULL, 1048575ULL, 2097151ULL, 4194303ULL, 8388607ULL, 16777215ULL, 33554431ULL, 67108863ULL, 134217727ULL, 268435455ULL, 536870911ULL, 1073741823ULL, 2147483647ULL, 4294967295ULL, 8589934591ULL, 17179869183ULL, 34359738367ULL, 68719476735ULL, 137438953471ULL, 274877906943ULL, 549755813887ULL, 1099511627775ULL, 2199023255551ULL, 4398046511103ULL, 8796093022207ULL, 17592186044415ULL, 35184372088831ULL, 70368744177663ULL, 140737488355327ULL, 281474976710655ULL, 562949953421311ULL, 1125899906842623ULL, 2251799813685247ULL, 4503599627370495ULL, 9007199254740991ULL, 18014398509481983ULL, 36028797018963967ULL, 72057594037927935ULL, 144115188075855871ULL, 288230376151711743ULL, 576460752303423487ULL, 1152921504606846975ULL, 2305843009213693951ULL, 4611686018427387903ULL, 9223372036854775807ULL, 18446744073709551615ULL};
    inline static constexpr array<u64,word_size> next_upper_bound_mask = {18446744073709551614ULL, 18446744073709551612ULL, 18446744073709551608ULL, 18446744073709551600ULL, 18446744073709551584ULL, 18446744073709551552ULL, 18446744073709551488ULL, 18446744073709551360ULL, 18446744073709551104ULL, 18446744073709550592ULL, 18446744073709549568ULL, 18446744073709547520ULL, 18446744073709543424ULL, 18446744073709535232ULL, 18446744073709518848ULL, 18446744073709486080ULL, 18446744073709420544ULL, 18446744073709289472ULL, 18446744073709027328ULL, 18446744073708503040ULL, 18446744073707454464ULL, 18446744073705357312ULL, 18446744073701163008ULL, 18446744073692774400ULL, 18446744073675997184ULL, 18446744073642442752ULL, 18446744073575333888ULL, 18446744073441116160ULL, 18446744073172680704ULL, 18446744072635809792ULL, 18446744071562067968ULL, 18446744069414584320ULL, 18446744065119617024ULL, 18446744056529682432ULL, 18446744039349813248ULL, 18446744004990074880ULL, 18446743936270598144ULL, 18446743798831644672ULL, 18446743523953737728ULL, 18446742974197923840ULL, 18446741874686296064ULL, 18446739675663040512ULL, 18446735277616529408ULL, 18446726481523507200ULL, 18446708889337462784ULL, 18446673704965373952ULL, 18446603336221196288ULL, 18446462598732840960ULL, 18446181123756130304ULL, 18445618173802708992ULL, 18444492273895866368ULL, 18442240474082181120ULL, 18437736874454810624ULL, 18428729675200069632ULL, 18410715276690587648ULL, 18374686479671623680ULL, 18302628885633695744ULL, 18158513697557839872ULL, 17870283321406128128ULL, 17293822569102704640ULL, 16140901064495857664ULL, 13835058055282163712ULL, 9223372036854775808ULL, 0ULL};
    inline static constexpr array<u64,word_size> prev_upper_bound_mask = {0ULL, 1ULL, 3ULL, 7ULL, 15ULL, 31ULL, 63ULL, 127ULL, 255ULL, 511ULL, 1023ULL, 2047ULL, 4095ULL, 8191ULL, 16383ULL, 32767ULL, 65535ULL, 131071ULL, 262143ULL, 524287ULL, 1048575ULL, 2097151ULL, 4194303ULL, 8388607ULL, 16777215ULL, 33554431ULL, 67108863ULL, 134217727ULL, 268435455ULL, 536870911ULL, 1073741823ULL, 2147483647ULL, 4294967295ULL, 8589934591ULL, 17179869183ULL, 34359738367ULL, 68719476735ULL, 137438953471ULL, 274877906943ULL, 549755813887ULL, 1099511627775ULL, 2199023255551ULL, 4398046511103ULL, 8796093022207ULL, 17592186044415ULL, 35184372088831ULL, 70368744177663ULL, 140737488355327ULL, 281474976710655ULL, 562949953421311ULL, 1125899906842623ULL, 2251799813685247ULL, 4503599627370495ULL, 9007199254740991ULL, 18014398509481983ULL, 36028797018963967ULL, 72057594037927935ULL, 144115188075855871ULL, 288230376151711743ULL, 576460752303423487ULL, 1152921504606846975ULL, 2305843009213693951ULL, 4611686018427387903ULL, 9223372036854775807ULL};

    inline static constexpr u64 ctz(const u64& value){
        // 1010100010101000101010001010100010101000101010001010100010101000 -> 3
        // 1010100010101000101010001010100010101000101010001010100010101001 -> 0
        // 1010100010101000101010001010100010101000101010001010100010100000 -> 5
        // 0000000000000000000000000000000000000000000000000000000000000000 -> undef
        return __builtin_ctzll(value);
    }
    inline static constexpr u64 clz(const u64& value){
        // 0000100010101000101010001010100010101000101010001010100010101000 -> 63 - 4 = 59
        // 1000100010101000101010001010100010101000101010001010100010101000 -> 63 - 0 = 63
        // 0000000010101000101010001010100010101000101010001010100010101000 -> 63 - 9 = 54
        // 0000000000000000000000000000000000000000000000000000000000000000 -> undef
        return word_size - 1 - __builtin_clzll(value);
    }

    template<u64 length, u64 ZZ=length> class Inner{
    private:        
        static_assert(length%word_size==0);
        inline static constexpr u64 child_length = length/word_size;
        u64 node;
        array<Inner<child_length, child_length>, word_size> child;
    public:
        Inner(): node(0ULL),child() {}
        bool insert_impl(const u64& value) {
            u64 idx = value / (child_length);
            node |= pow2[idx];
            return child[idx].insert_impl(value % child_length);
        }
        bool erase_impl(const u64& value) {
            u64 idx = value / (child_length);
            bool is_exist_child_node = child[idx].erase_impl(value % child_length);
            if(!is_exist_child_node) node &= ~pow2[idx];
            return node;
        }
        bool count_impl(const u64& value) const {
            u64 idx = value / (child_length);
            return (node & pow2[idx]) && child[idx].count_impl(value % child_length);
        }
        u64 next_lower_bound_impl(const u64& value) const {
            u64 idx = value / (child_length);
            if(node & pow2[idx]) {
                const u64 res = child[idx].next_lower_bound_impl(value % child_length);
                if(res != max_length) return idx*child_length + res;
            }
            u64 masked_node = (node & next_upper_bound_mask[idx]);
            if(masked_node==0) return max_length;
            {
                u64 idx2=ctz(masked_node);
                u64 res = child[idx2].next_lower_bound_impl(0);
                return idx2*child_length + res;
            }
        }
        u64 prev_lower_bound_impl(const u64& value) const {
            u64 idx = value / (child_length);
            if(node & pow2[idx]) {
                const u64 res = child[idx].prev_lower_bound_impl(value % child_length);
                if(res != max_length) return idx*child_length + res;
            }
            u64 masked_node = (node & prev_upper_bound_mask[idx]);
            if(masked_node==0) return max_length;
            {
                u64 idx2=clz(masked_node);
                u64 res = child[idx2].prev_lower_bound_impl(child_length - 1);
                return idx2*child_length + res;
            }
        }
    };
    template<unsigned long long length> class Inner<length, word_size>{
    private:
        u64 node;
    public:
        Inner(): node(0ULL){}
        bool insert_impl(const u64& idx) {
            bool is_inserted = (node & pow2[idx]);
            node |= pow2[idx];
            return !is_inserted;        
        }
        bool erase_impl(const u64& idx) {
            bool is_inserted = (node & pow2[idx]);
            node &= ~pow2[idx];
            return node;
        }
        bool count_impl(const u64& idx) const {
            return (node & pow2[idx]);
        }
        u64 next_lower_bound_impl(const u64& idx) const {
            u64 masked_node = (node & next_lower_bound_mask[idx]);
            if(masked_node==0) return max_length;
            return ctz(masked_node);
        }
        u64 prev_lower_bound_impl(const u64& idx) const {
            u64 masked_node = (node & prev_lower_bound_mask[idx]);
            if(masked_node==0) return max_length;
            return clz(masked_node);
        }
    };
    Inner<max_length> inner;
public:
    WordSizeTreeSet():inner(){}
    void insert(const u64& value){inner.insert_impl(value);}
    void erase(const u64& value){inner.erase_impl(value);}
    bool count(const u64& value) const {return inner.count_impl(value);}
    u64 next_lower_bound(const u64& value) const {return inner.next_lower_bound_impl(value);}
    u64 prev_lower_bound(const u64& value) const {return inner.prev_lower_bound_impl(value);}
};
#line 1 "lib/12-binary-search-tree/WordSizeTreeSet.cpp"
/*
 * @title WordSizeTreeSet - 64分木
 * @docs md/binary-search-tree/WordSizeTreeSet.md
 */
class WordSizeTreeSet {
public:
    using u64 = unsigned long long;
    inline static constexpr u64 max_length=(1ULL<<24);
private:
    inline static constexpr u64 word_size=(1ULL<<6);
    inline static constexpr array<u64,word_size> pow2 = {1ULL, 2ULL, 4ULL, 8ULL, 16ULL, 32ULL, 64ULL, 128ULL, 256ULL, 512ULL, 1024ULL, 2048ULL, 4096ULL, 8192ULL, 16384ULL, 32768ULL, 65536ULL, 131072ULL, 262144ULL, 524288ULL, 1048576ULL, 2097152ULL, 4194304ULL, 8388608ULL, 16777216ULL, 33554432ULL, 67108864ULL, 134217728ULL, 268435456ULL, 536870912ULL, 1073741824ULL, 2147483648ULL, 4294967296ULL, 8589934592ULL, 17179869184ULL, 34359738368ULL, 68719476736ULL, 137438953472ULL, 274877906944ULL, 549755813888ULL, 1099511627776ULL, 2199023255552ULL, 4398046511104ULL, 8796093022208ULL, 17592186044416ULL, 35184372088832ULL, 70368744177664ULL, 140737488355328ULL, 281474976710656ULL, 562949953421312ULL, 1125899906842624ULL, 2251799813685248ULL, 4503599627370496ULL, 9007199254740992ULL, 18014398509481984ULL, 36028797018963968ULL, 72057594037927936ULL, 144115188075855872ULL, 288230376151711744ULL, 576460752303423488ULL, 1152921504606846976ULL, 2305843009213693952ULL, 4611686018427387904ULL, 9223372036854775808ULL};
    inline static constexpr array<u64,word_size> next_lower_bound_mask = {18446744073709551615ULL, 18446744073709551614ULL, 18446744073709551612ULL, 18446744073709551608ULL, 18446744073709551600ULL, 18446744073709551584ULL, 18446744073709551552ULL, 18446744073709551488ULL, 18446744073709551360ULL, 18446744073709551104ULL, 18446744073709550592ULL, 18446744073709549568ULL, 18446744073709547520ULL, 18446744073709543424ULL, 18446744073709535232ULL, 18446744073709518848ULL, 18446744073709486080ULL, 18446744073709420544ULL, 18446744073709289472ULL, 18446744073709027328ULL, 18446744073708503040ULL, 18446744073707454464ULL, 18446744073705357312ULL, 18446744073701163008ULL, 18446744073692774400ULL, 18446744073675997184ULL, 18446744073642442752ULL, 18446744073575333888ULL, 18446744073441116160ULL, 18446744073172680704ULL, 18446744072635809792ULL, 18446744071562067968ULL, 18446744069414584320ULL, 18446744065119617024ULL, 18446744056529682432ULL, 18446744039349813248ULL, 18446744004990074880ULL, 18446743936270598144ULL, 18446743798831644672ULL, 18446743523953737728ULL, 18446742974197923840ULL, 18446741874686296064ULL, 18446739675663040512ULL, 18446735277616529408ULL, 18446726481523507200ULL, 18446708889337462784ULL, 18446673704965373952ULL, 18446603336221196288ULL, 18446462598732840960ULL, 18446181123756130304ULL, 18445618173802708992ULL, 18444492273895866368ULL, 18442240474082181120ULL, 18437736874454810624ULL, 18428729675200069632ULL, 18410715276690587648ULL, 18374686479671623680ULL, 18302628885633695744ULL, 18158513697557839872ULL, 17870283321406128128ULL, 17293822569102704640ULL, 16140901064495857664ULL, 13835058055282163712ULL, 9223372036854775808ULL};
    inline static constexpr array<u64,word_size> prev_lower_bound_mask = {1ULL, 3ULL, 7ULL, 15ULL, 31ULL, 63ULL, 127ULL, 255ULL, 511ULL, 1023ULL, 2047ULL, 4095ULL, 8191ULL, 16383ULL, 32767ULL, 65535ULL, 131071ULL, 262143ULL, 524287ULL, 1048575ULL, 2097151ULL, 4194303ULL, 8388607ULL, 16777215ULL, 33554431ULL, 67108863ULL, 134217727ULL, 268435455ULL, 536870911ULL, 1073741823ULL, 2147483647ULL, 4294967295ULL, 8589934591ULL, 17179869183ULL, 34359738367ULL, 68719476735ULL, 137438953471ULL, 274877906943ULL, 549755813887ULL, 1099511627775ULL, 2199023255551ULL, 4398046511103ULL, 8796093022207ULL, 17592186044415ULL, 35184372088831ULL, 70368744177663ULL, 140737488355327ULL, 281474976710655ULL, 562949953421311ULL, 1125899906842623ULL, 2251799813685247ULL, 4503599627370495ULL, 9007199254740991ULL, 18014398509481983ULL, 36028797018963967ULL, 72057594037927935ULL, 144115188075855871ULL, 288230376151711743ULL, 576460752303423487ULL, 1152921504606846975ULL, 2305843009213693951ULL, 4611686018427387903ULL, 9223372036854775807ULL, 18446744073709551615ULL};
    inline static constexpr array<u64,word_size> next_upper_bound_mask = {18446744073709551614ULL, 18446744073709551612ULL, 18446744073709551608ULL, 18446744073709551600ULL, 18446744073709551584ULL, 18446744073709551552ULL, 18446744073709551488ULL, 18446744073709551360ULL, 18446744073709551104ULL, 18446744073709550592ULL, 18446744073709549568ULL, 18446744073709547520ULL, 18446744073709543424ULL, 18446744073709535232ULL, 18446744073709518848ULL, 18446744073709486080ULL, 18446744073709420544ULL, 18446744073709289472ULL, 18446744073709027328ULL, 18446744073708503040ULL, 18446744073707454464ULL, 18446744073705357312ULL, 18446744073701163008ULL, 18446744073692774400ULL, 18446744073675997184ULL, 18446744073642442752ULL, 18446744073575333888ULL, 18446744073441116160ULL, 18446744073172680704ULL, 18446744072635809792ULL, 18446744071562067968ULL, 18446744069414584320ULL, 18446744065119617024ULL, 18446744056529682432ULL, 18446744039349813248ULL, 18446744004990074880ULL, 18446743936270598144ULL, 18446743798831644672ULL, 18446743523953737728ULL, 18446742974197923840ULL, 18446741874686296064ULL, 18446739675663040512ULL, 18446735277616529408ULL, 18446726481523507200ULL, 18446708889337462784ULL, 18446673704965373952ULL, 18446603336221196288ULL, 18446462598732840960ULL, 18446181123756130304ULL, 18445618173802708992ULL, 18444492273895866368ULL, 18442240474082181120ULL, 18437736874454810624ULL, 18428729675200069632ULL, 18410715276690587648ULL, 18374686479671623680ULL, 18302628885633695744ULL, 18158513697557839872ULL, 17870283321406128128ULL, 17293822569102704640ULL, 16140901064495857664ULL, 13835058055282163712ULL, 9223372036854775808ULL, 0ULL};
    inline static constexpr array<u64,word_size> prev_upper_bound_mask = {0ULL, 1ULL, 3ULL, 7ULL, 15ULL, 31ULL, 63ULL, 127ULL, 255ULL, 511ULL, 1023ULL, 2047ULL, 4095ULL, 8191ULL, 16383ULL, 32767ULL, 65535ULL, 131071ULL, 262143ULL, 524287ULL, 1048575ULL, 2097151ULL, 4194303ULL, 8388607ULL, 16777215ULL, 33554431ULL, 67108863ULL, 134217727ULL, 268435455ULL, 536870911ULL, 1073741823ULL, 2147483647ULL, 4294967295ULL, 8589934591ULL, 17179869183ULL, 34359738367ULL, 68719476735ULL, 137438953471ULL, 274877906943ULL, 549755813887ULL, 1099511627775ULL, 2199023255551ULL, 4398046511103ULL, 8796093022207ULL, 17592186044415ULL, 35184372088831ULL, 70368744177663ULL, 140737488355327ULL, 281474976710655ULL, 562949953421311ULL, 1125899906842623ULL, 2251799813685247ULL, 4503599627370495ULL, 9007199254740991ULL, 18014398509481983ULL, 36028797018963967ULL, 72057594037927935ULL, 144115188075855871ULL, 288230376151711743ULL, 576460752303423487ULL, 1152921504606846975ULL, 2305843009213693951ULL, 4611686018427387903ULL, 9223372036854775807ULL};

    inline static constexpr u64 ctz(const u64& value){
        // 1010100010101000101010001010100010101000101010001010100010101000 -> 3
        // 1010100010101000101010001010100010101000101010001010100010101001 -> 0
        // 1010100010101000101010001010100010101000101010001010100010100000 -> 5
        // 0000000000000000000000000000000000000000000000000000000000000000 -> undef
        return __builtin_ctzll(value);
    }
    inline static constexpr u64 clz(const u64& value){
        // 0000100010101000101010001010100010101000101010001010100010101000 -> 63 - 4 = 59
        // 1000100010101000101010001010100010101000101010001010100010101000 -> 63 - 0 = 63
        // 0000000010101000101010001010100010101000101010001010100010101000 -> 63 - 9 = 54
        // 0000000000000000000000000000000000000000000000000000000000000000 -> undef
        return word_size - 1 - __builtin_clzll(value);
    }

    template<u64 length, u64 ZZ=length> class Inner{
    private:        
        static_assert(length%word_size==0);
        inline static constexpr u64 child_length = length/word_size;
        u64 node;
        array<Inner<child_length, child_length>, word_size> child;
    public:
        Inner(): node(0ULL),child() {}
        bool insert_impl(const u64& value) {
            u64 idx = value / (child_length);
            node |= pow2[idx];
            return child[idx].insert_impl(value % child_length);
        }
        bool erase_impl(const u64& value) {
            u64 idx = value / (child_length);
            bool is_exist_child_node = child[idx].erase_impl(value % child_length);
            if(!is_exist_child_node) node &= ~pow2[idx];
            return node;
        }
        bool count_impl(const u64& value) const {
            u64 idx = value / (child_length);
            return (node & pow2[idx]) && child[idx].count_impl(value % child_length);
        }
        u64 next_lower_bound_impl(const u64& value) const {
            u64 idx = value / (child_length);
            if(node & pow2[idx]) {
                const u64 res = child[idx].next_lower_bound_impl(value % child_length);
                if(res != max_length) return idx*child_length + res;
            }
            u64 masked_node = (node & next_upper_bound_mask[idx]);
            if(masked_node==0) return max_length;
            {
                u64 idx2=ctz(masked_node);
                u64 res = child[idx2].next_lower_bound_impl(0);
                return idx2*child_length + res;
            }
        }
        u64 prev_lower_bound_impl(const u64& value) const {
            u64 idx = value / (child_length);
            if(node & pow2[idx]) {
                const u64 res = child[idx].prev_lower_bound_impl(value % child_length);
                if(res != max_length) return idx*child_length + res;
            }
            u64 masked_node = (node & prev_upper_bound_mask[idx]);
            if(masked_node==0) return max_length;
            {
                u64 idx2=clz(masked_node);
                u64 res = child[idx2].prev_lower_bound_impl(child_length - 1);
                return idx2*child_length + res;
            }
        }
    };
    template<unsigned long long length> class Inner<length, word_size>{
    private:
        u64 node;
    public:
        Inner(): node(0ULL){}
        bool insert_impl(const u64& idx) {
            bool is_inserted = (node & pow2[idx]);
            node |= pow2[idx];
            return !is_inserted;        
        }
        bool erase_impl(const u64& idx) {
            bool is_inserted = (node & pow2[idx]);
            node &= ~pow2[idx];
            return node;
        }
        bool count_impl(const u64& idx) const {
            return (node & pow2[idx]);
        }
        u64 next_lower_bound_impl(const u64& idx) const {
            u64 masked_node = (node & next_lower_bound_mask[idx]);
            if(masked_node==0) return max_length;
            return ctz(masked_node);
        }
        u64 prev_lower_bound_impl(const u64& idx) const {
            u64 masked_node = (node & prev_lower_bound_mask[idx]);
            if(masked_node==0) return max_length;
            return clz(masked_node);
        }
    };
    Inner<max_length> inner;
public:
    WordSizeTreeSet():inner(){}
    void insert(const u64& value){inner.insert_impl(value);}
    void erase(const u64& value){inner.erase_impl(value);}
    bool count(const u64& value) const {return inner.count_impl(value);}
    u64 next_lower_bound(const u64& value) const {return inner.next_lower_bound_impl(value);}
    u64 prev_lower_bound(const u64& value) const {return inner.prev_lower_bound_impl(value);}
};
Back to top page