#pragma once
structBitVector{usingi32=int32_t;usingu32=uint32_t;usingu64=uint64_t;staticconstexpru32W=64;inlineu32get(u32i)const{returnu32(block[i/W]>>(i%W))&1u;}inlinevoidset(u32i){block[i/W]|=1ull<<(i%W);}vector<u64>block;vector<i32>count;u32n,zeros;BitVector(){}BitVector(int_n):n(_n){block.resize(n/W+1,0);count.resize(block.size(),0);}voidbuild(){for(u32i=1;i<block.size();i++)count[i]=count[i-1]+__builtin_popcountll(block[i-1]);zeros=rank0(n);}inlineu32rank0(u32i)const{returni-rank1(i);}inlineu32rank1(u32i)const{returncount[i/W]+__builtin_popcountll(block[i/W]&((1ull<<i%W)-1));}};