#pragma once
structBitSet{usingu64=uint64_t;vector<u64>dat;intn;staticu64maskbit(intp){return1ULL<<p;}structProxy{u64&dat;intidx;Proxy(vector<u64>&d,inti):dat(d[i>>6]),idx(i&63){}operatorbool()const{return(dat>>idx)&1;}booloperator~()const{return((dat>>idx)&1)^1;}Proxy&flip(){dat^=maskbit(idx);return*this;}Proxy&operator=(boolx){if(x)dat|=maskbit(idx);elsedat&=~maskbit(idx);return*this;}Proxy&operator=(constProxy&o){return*this=bool(o);}Proxy&operator|=(boolx){if(x)dat|=maskbit(idx);return*this;}Proxy&operator&=(boolx){if(!x)dat&=~maskbit(idx);return*this;}Proxy&operator^=(boolx){if(x)dat^=maskbit(idx);return*this;}};explicitBitSet(int_n=0,boolx=false):dat((_n+63)>>6,u64(x?-1:0)),n(_n){trim();}intsize()const{returnn;}voidtrim(){if(n&63)dat.back()&=maskbit(n&63)-1;}voidresize(intm,boolx=false){assert(m>=0);if(x&&n<m&&(n&63))dat[n>>6]|=u64(-1)<<(n&63);dat.resize((m+63)>>6,u64(x?-1:0));n=m;trim();}voidpush_back(boolx){if((n&63)==0)dat.push_back(0);if(x)dat[n>>6]|=maskbit(n&63);n++;}voidpop_back(){assert(n>0);n--;if((n&63)==0)dat.pop_back();elsedat.back()&=maskbit(n&63)-1;}Proxyoperator[](inti){assert(0<=i&&i<n);returnProxy(dat,i);}booloperator[](inti)const{assert(0<=i&&i<n);return(dat[i>>6]>>(i&63))&1;}voidset(){fill(ALL(dat),u64(-1));trim();}voidreset(){fill(ALL(dat),0);}voidflip(){for(auto&x:dat)x=~x;trim();}voidset(inti){(*this)[i]=1;}voidreset(inti){(*this)[i]=0;}voidflip(inti){(*this)[i].flip();}intcount()const{intres=0;for(autox:dat)res+=__builtin_popcountll(x);returnres;}boolany()const{for(autox:dat)if(x)returntrue;returnfalse;}boolnone()const{return!any();}boolall()const{returncount()==n;}BitSet&operator&=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]&=o.dat[i];return*this;}BitSet&operator|=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]|=o.dat[i];return*this;}BitSet&operator^=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]^=o.dat[i];return*this;}BitSet&operator<<=(intk){assert(k>=0);if(k>=n)returnreset(),*this;intq=k>>6,r=k&63,m=SZ(dat);if(!r){for(inti=m-1;i>=q;i--)dat[i]=dat[i-q];}else{for(inti=m-1;i>q;i--)dat[i]=(dat[i-q]<<r)|(dat[i-q-1]>>(64-r));dat[q]=dat[0]<<r;}fill(dat.begin(),dat.begin()+q,0);trim();return*this;}BitSet&operator>>=(intk){assert(k>=0);if(k>=n)returnreset(),*this;intq=k>>6,r=k&63,m=SZ(dat);if(!r){for(inti=0;i+q<m;i++)dat[i]=dat[i+q];}else{for(inti=0;i+q+1<m;i++)dat[i]=(dat[i+q]>>r)|(dat[i+q+1]<<(64-r));dat[m-q-1]=dat[m-1]>>r;}fill(dat.end()-q,dat.end(),0);return*this;}BitSetoperator&(constBitSet&o)const{returnBitSet(*this)&=o;}BitSetoperator|(constBitSet&o)const{returnBitSet(*this)|=o;}BitSetoperator^(constBitSet&o)const{returnBitSet(*this)^=o;}BitSetoperator<<(intk)const{returnBitSet(*this)<<=k;}BitSetoperator>>(intk)const{returnBitSet(*this)>>=k;}booloperator==(constBitSet&o){returnn==o.n&&dat==o.dat;}booloperator!=(constBitSet&o){return!(*this==o);}BitSetoperator~()const{BitSeto(*this);o.flip();returno;}intfind_next(inti)const{// first set bit >= i, n if noneif(i<0)i=0;if(i>=n)returnn;intq=i>>6;u64x=dat[q]&(u64(-1)<<(i&63));while(!x){if(++q==SZ(dat))returnn;x=dat[q];}returnq<<6|__builtin_ctzll(x);}intfind_prev(inti)const{// last set bit <= i, -1 if noneif(i>=n)i=n-1;if(i<0)return-1;intq=i>>6;u64x=dat[q]&(u64(-1)>>(63-(i&63)));while(!x){if(--q<0)return-1;x=dat[q];}returnq<<6|(63-__builtin_clzll(x));}intfind_first()const{returnfind_next(0);}intfind_last()const{returnfind_prev(n-1);}voidset_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]|=ml&mr);if(l&63)dat[ql++]|=ml;if(r&63)dat[qr]|=mr;for(inti=ql;i<qr;i++)dat[i]=u64(-1);}voidreset_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]&=~(ml&mr));if(l&63)dat[ql++]&=~ml;if(r&63)dat[qr]&=~mr;for(inti=ql;i<qr;i++)dat[i]=u64(0);}voidflip_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]^=ml&mr);if(l&63)dat[ql++]^=ml;if(r&63)dat[qr]^=mr;for(inti=ql;i<qr;i++)dat[i]=~dat[i];}intcount_range(intl,intr)const{assert(0<=l&&l<=r&&r<=n);if(l==r)return0;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)return__builtin_popcountll(dat[ql]&ml&mr);intres=0;if(l&63)res+=__builtin_popcountll(dat[ql++]&ml);if(r&63)res+=__builtin_popcountll(dat[qr]&mr);for(inti=ql;i<qr;i++)res+=__builtin_popcountll(dat[i]);returnres;}};
#line 2 "data-structure/bitset.hpp"
structBitSet{usingu64=uint64_t;vector<u64>dat;intn;staticu64maskbit(intp){return1ULL<<p;}structProxy{u64&dat;intidx;Proxy(vector<u64>&d,inti):dat(d[i>>6]),idx(i&63){}operatorbool()const{return(dat>>idx)&1;}booloperator~()const{return((dat>>idx)&1)^1;}Proxy&flip(){dat^=maskbit(idx);return*this;}Proxy&operator=(boolx){if(x)dat|=maskbit(idx);elsedat&=~maskbit(idx);return*this;}Proxy&operator=(constProxy&o){return*this=bool(o);}Proxy&operator|=(boolx){if(x)dat|=maskbit(idx);return*this;}Proxy&operator&=(boolx){if(!x)dat&=~maskbit(idx);return*this;}Proxy&operator^=(boolx){if(x)dat^=maskbit(idx);return*this;}};explicitBitSet(int_n=0,boolx=false):dat((_n+63)>>6,u64(x?-1:0)),n(_n){trim();}intsize()const{returnn;}voidtrim(){if(n&63)dat.back()&=maskbit(n&63)-1;}voidresize(intm,boolx=false){assert(m>=0);if(x&&n<m&&(n&63))dat[n>>6]|=u64(-1)<<(n&63);dat.resize((m+63)>>6,u64(x?-1:0));n=m;trim();}voidpush_back(boolx){if((n&63)==0)dat.push_back(0);if(x)dat[n>>6]|=maskbit(n&63);n++;}voidpop_back(){assert(n>0);n--;if((n&63)==0)dat.pop_back();elsedat.back()&=maskbit(n&63)-1;}Proxyoperator[](inti){assert(0<=i&&i<n);returnProxy(dat,i);}booloperator[](inti)const{assert(0<=i&&i<n);return(dat[i>>6]>>(i&63))&1;}voidset(){fill(ALL(dat),u64(-1));trim();}voidreset(){fill(ALL(dat),0);}voidflip(){for(auto&x:dat)x=~x;trim();}voidset(inti){(*this)[i]=1;}voidreset(inti){(*this)[i]=0;}voidflip(inti){(*this)[i].flip();}intcount()const{intres=0;for(autox:dat)res+=__builtin_popcountll(x);returnres;}boolany()const{for(autox:dat)if(x)returntrue;returnfalse;}boolnone()const{return!any();}boolall()const{returncount()==n;}BitSet&operator&=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]&=o.dat[i];return*this;}BitSet&operator|=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]|=o.dat[i];return*this;}BitSet&operator^=(constBitSet&o){assert(n==o.n);for(inti=0;i<SZ(dat);i++)dat[i]^=o.dat[i];return*this;}BitSet&operator<<=(intk){assert(k>=0);if(k>=n)returnreset(),*this;intq=k>>6,r=k&63,m=SZ(dat);if(!r){for(inti=m-1;i>=q;i--)dat[i]=dat[i-q];}else{for(inti=m-1;i>q;i--)dat[i]=(dat[i-q]<<r)|(dat[i-q-1]>>(64-r));dat[q]=dat[0]<<r;}fill(dat.begin(),dat.begin()+q,0);trim();return*this;}BitSet&operator>>=(intk){assert(k>=0);if(k>=n)returnreset(),*this;intq=k>>6,r=k&63,m=SZ(dat);if(!r){for(inti=0;i+q<m;i++)dat[i]=dat[i+q];}else{for(inti=0;i+q+1<m;i++)dat[i]=(dat[i+q]>>r)|(dat[i+q+1]<<(64-r));dat[m-q-1]=dat[m-1]>>r;}fill(dat.end()-q,dat.end(),0);return*this;}BitSetoperator&(constBitSet&o)const{returnBitSet(*this)&=o;}BitSetoperator|(constBitSet&o)const{returnBitSet(*this)|=o;}BitSetoperator^(constBitSet&o)const{returnBitSet(*this)^=o;}BitSetoperator<<(intk)const{returnBitSet(*this)<<=k;}BitSetoperator>>(intk)const{returnBitSet(*this)>>=k;}booloperator==(constBitSet&o){returnn==o.n&&dat==o.dat;}booloperator!=(constBitSet&o){return!(*this==o);}BitSetoperator~()const{BitSeto(*this);o.flip();returno;}intfind_next(inti)const{// first set bit >= i, n if noneif(i<0)i=0;if(i>=n)returnn;intq=i>>6;u64x=dat[q]&(u64(-1)<<(i&63));while(!x){if(++q==SZ(dat))returnn;x=dat[q];}returnq<<6|__builtin_ctzll(x);}intfind_prev(inti)const{// last set bit <= i, -1 if noneif(i>=n)i=n-1;if(i<0)return-1;intq=i>>6;u64x=dat[q]&(u64(-1)>>(63-(i&63)));while(!x){if(--q<0)return-1;x=dat[q];}returnq<<6|(63-__builtin_clzll(x));}intfind_first()const{returnfind_next(0);}intfind_last()const{returnfind_prev(n-1);}voidset_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]|=ml&mr);if(l&63)dat[ql++]|=ml;if(r&63)dat[qr]|=mr;for(inti=ql;i<qr;i++)dat[i]=u64(-1);}voidreset_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]&=~(ml&mr));if(l&63)dat[ql++]&=~ml;if(r&63)dat[qr]&=~mr;for(inti=ql;i<qr;i++)dat[i]=u64(0);}voidflip_range(intl,intr){assert(0<=l&&l<=r&&r<=n);if(l==r)return;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)returnvoid(dat[ql]^=ml&mr);if(l&63)dat[ql++]^=ml;if(r&63)dat[qr]^=mr;for(inti=ql;i<qr;i++)dat[i]=~dat[i];}intcount_range(intl,intr)const{assert(0<=l&&l<=r&&r<=n);if(l==r)return0;intql=l>>6,qr=r>>6;u64ml=u64(-1)<<(l&63),mr=maskbit(r&63)-1;if(ql==qr)return__builtin_popcountll(dat[ql]&ml&mr);intres=0;if(l&63)res+=__builtin_popcountll(dat[ql++]&ml);if(r&63)res+=__builtin_popcountll(dat[qr]&mr);for(inti=ql;i<qr;i++)res+=__builtin_popcountll(dat[i]);returnres;}};