#pragma once
#include"template.hpp"/**
* Author: Teetat T.
* Date: 2026-04-16
* Description: Fast Set
*/structFastSet{usingu64=uint64_t;intn,len;vector<u64>t;FastSet(){}FastSet(intn){build(n);}intsize(){returnn;}voidbuild(int_n){assert(_n>=0);n=_n;len=1;while((len<<6)<n)len<<=6;len/=63;t.resize(len+(n+63)/64);}boolcount(inti)const{assert(0<=i&&i<n);returnt[len+(i>>6)]>>(i&63)&1;}voidinsert(intx){assert(0<=x&&x<n);inti=len+(x>>6),j=x&63;while(true){if(t[i]>>j&1ULL)return;t[i]|=1ULL<<j;if(!i)return;j=(--i)&63;i>>=6;}}voiderase(intx){assert(0<=x&&x<n);inti=len+(x>>6),j=x&63;while(true){t[i]&=~(1ULL<<j);if(!i||t[i])return;j=(--i)&63;i>>=6;}}intnext(intx){if(x>=n)returnn;if(x<0)x=0;if(count(x))returnx;inti=len+(x>>6),j=x&63;while(true){if(t[i]&((~1ULL)<<j)){j=__builtin_ctzll(t[i]&((~1ULL)<<j));if(i>=len)return(i-len)*64+j;break;}if(!i)returnn;j=(--i)&63;i>>=6;}i=i*64+j+1;while(i<len)i=i*64+__builtin_ctzll(t[i])+1;return(i-len)*64+__builtin_ctzll(t[i]);}intprev(intx){if(x<0)return-1;if(x>=n)x=n-1;if(count(x))returnx;inti=len+(x>>6),j=x&63;while(true){if(t[i]&((1ULL<<j)-1ULL)){j=63-__builtin_clzll(t[i]&((1ULL<<j)-1ULL));if(i>=len)return(i-len)*64+j;break;}if(!i)return-1;j=(--i)&63;i>>=6;}i=i*64+j+1;while(i<len)i=i*64+64-__builtin_clzll(t[i]);return(i-len)*64+63-__builtin_clzll(t[i]);}};