萌新求助底层分块线段树上 Hash

P3822 [NOI2017] 整数

```cpp #include <algorithm> #include <stdio.h> #include <vector> typedef long long llt; typedef unsigned uint;typedef unsigned long long ullt; typedef bool bol;typedef char chr;typedef void voi; typedef double dbl; template<typename T>bol _max(T&a,T b){return(a<b)?a=b,true:false;} template<typename T>bol _min(T&a,T b){return(b<a)?a=b,true:false;} template<typename T>T lowbit(T n){return n&-n;} template<typename T>T gcd(T a,T b){return b?gcd(b,a%b):a;} template<typename T>T lcm(T a,T b){return(a!=0||b!=0)?a/gcd(a,b)*b:(T)0;} template<typename T>T exgcd(T a,T b,T&x,T&y){if(b!=0){T ans=exgcd(b,a%b,y,x);y-=a/b*x;return ans;}else return y=0,x=1,a;} template<typename T>T power(T base,T index,T mod) { T ans=1%mod; while(index) { if(index&1)ans=ans*base%mod; base=base*base%mod,index>>=1; } return ans; } const ullt Mod=1e9+7,g=5; struct Seg { Seg*L,*R;uint len;ullt v; Seg(uint n):L(NULL),R(NULL),len(n),v(0){if(n>1)L=new Seg(n>>1),R=new Seg(n-(n>>1));} bol add(uint p,ullt w) { if(len==1)return(v=(v+w)&-1u)<w; bol ans=(p<(len>>1))?L->add(p,w):R->add(p-(len>>1),w); v=(L->v*g+R->v)%Mod;return ans; } bol getop(uint p,uint t){return(len==1)?v>>t&1:(p<(len>>1)?L->getop(p,t):R->getop(p-(len>>1),t));} }Add(1048576),Del(1048576); llt compare(Seg*A,Seg*D,uint p,uint t) { if(A->v==D->v)return 0; if(A->len==1)return((A->v)&((1llu<<t)-1))-((D->v)&((1llu<<t)-1)); if(p<(A->len>>1))return compare(A->L,D->L,p,t); llt v=compare(A->R,D->R,p-(A->len>>1),t);if(v)return v; return compare(A->L,D->L,(A->len>>1)-1,32); } voi add(Seg*A,ullt a,uint b){ a<<=b&31,b>>=5; {ullt v=a&-1u;uint p=b;while(v)v=A->add(p++,v);} {ullt v=a>>32;uint p=b+1;while(v)v=A->add(p++,v);} } int main() { #ifdef MYEE freopen("QAQ.in","r",stdin); freopen("QAQ.out","w",stdout); #endif uint q;scanf("%u%*u%*u%*u",&q); while(q--) { uint op;scanf("%u",&op); if(op==1){llt a;uint b;scanf("%lld%u",&a,&b);if(a>0)add(&Add,a,b);else if(a<0)add(&Del,-a,b);} else{ uint k;scanf("%u",&k);putchar('0'+((compare(&Add,&Del,k>>5,k&31)<0)^Add.getop(k>>5,k&31)^Del.getop(k>>5,k&31))),putchar('\n'); } } return 0; } ```
by myee @ 2022-08-12 16:45:10


|