#ifndef AFDS_DYNAMIC_BITSET
#define AFDS_DYNAMIC_BITSET
#include<limits>
#include<numeric>
#include<vector>// TODO: Implement resize and bitwise operators. Figure out how to mod.classDynamicBitset{private:usingWord_t=unsignedlonglong;constexprstaticintbw=sizeof(Word_t)*8;constexprstaticWord_tWORD_MAX=std::numeric_limits<Word_t>::max();size_tn,cnt;std::vector<Word_t>bits;inlineintcalc_len(void){return(std::max<size_t>(n,bw)+bw-1)/bw;}public:DynamicBitset(size_tN):n(N),bits(calc_len()){}inlineintsize(void){returnn;}inlineintcount(void){returncnt;}inlineinttest(size_ti){return(bits[i/bw]>>(i%bw))&1;}inlinevoidset(size_ti,boolval=true){if(test(i)==val)return;bits[i/bw]^=(1ULL<<(i%bw));val?cnt++:cnt--;}inlinevoidflip(size_ti){bits[i/bw]^=(1ULL<<(i%bw));test(i)?cnt--:cnt++;}inlinevoidreset(void){std::fill(bits.begin(),bits.end(),0);cnt=0;}inlinevoidclear(void){bits.clear(),cnt=n=0;}// find the previous val before i. returns -1 if not found.inlineintpre(size_ti,boolcontain=false,boolval=true){Word_tcur=bits[i/bw];for(intj=(int)(i%bw)-(!contain);j>=0;j--){if((cur>>j&1)==val){returni-(i%bw-j);}}for(intj=i/bw-1;j>=0;j--){if(bits[j]==(val?0:WORD_MAX))continue;for(intk=bw-1;k>=0;k--){if((bits[j]>>k&1)==val){returnj*bw+k;}}}return-1;}inlineintsuf(size_ti,boolcontain=false,boolval=true){Word_tcur=bits[i/bw];for(intj=i%bw+(!contain);j<bw;j++){if((cur>>j&1)==val){returni+(j-i%bw);}}constintlen=calc_len();for(intj=i/bw+1;j<len;j++){if(bits[j]==(val?0:WORD_MAX))continue;for(intk=0;k<bw;k++){if((bits[j]>>k&1)==val){returnj*bw+k;}}}return-1;}};#endif // AFDS_DYNAMIC_BITSET
#line 1 "src/alfred/data_structure/dynamic-bitset.hpp"
#include<limits>
#include<numeric>
#include<vector>// TODO: Implement resize and bitwise operators. Figure out how to mod.classDynamicBitset{private:usingWord_t=unsignedlonglong;constexprstaticintbw=sizeof(Word_t)*8;constexprstaticWord_tWORD_MAX=std::numeric_limits<Word_t>::max();size_tn,cnt;std::vector<Word_t>bits;inlineintcalc_len(void){return(std::max<size_t>(n,bw)+bw-1)/bw;}public:DynamicBitset(size_tN):n(N),bits(calc_len()){}inlineintsize(void){returnn;}inlineintcount(void){returncnt;}inlineinttest(size_ti){return(bits[i/bw]>>(i%bw))&1;}inlinevoidset(size_ti,boolval=true){if(test(i)==val)return;bits[i/bw]^=(1ULL<<(i%bw));val?cnt++:cnt--;}inlinevoidflip(size_ti){bits[i/bw]^=(1ULL<<(i%bw));test(i)?cnt--:cnt++;}inlinevoidreset(void){std::fill(bits.begin(),bits.end(),0);cnt=0;}inlinevoidclear(void){bits.clear(),cnt=n=0;}// find the previous val before i. returns -1 if not found.inlineintpre(size_ti,boolcontain=false,boolval=true){Word_tcur=bits[i/bw];for(intj=(int)(i%bw)-(!contain);j>=0;j--){if((cur>>j&1)==val){returni-(i%bw-j);}}for(intj=i/bw-1;j>=0;j--){if(bits[j]==(val?0:WORD_MAX))continue;for(intk=bw-1;k>=0;k--){if((bits[j]>>k&1)==val){returnj*bw+k;}}}return-1;}inlineintsuf(size_ti,boolcontain=false,boolval=true){Word_tcur=bits[i/bw];for(intj=i%bw+(!contain);j<bw;j++){if((cur>>j&1)==val){returni+(j-i%bw);}}constintlen=calc_len();for(intj=i/bw+1;j<len;j++){if(bits[j]==(val?0:WORD_MAX))continue;for(intk=0;k<bw;k++){if((bits[j]>>k&1)==val){returnj*bw+k;}}}return-1;}};