草稿
#include <cstdio> #include <cstring> #include <algorithm> #define N 1000007 #define ll long long #define lson now<<1 #define rson now<<1|1 #define setIO(s) freopen(s".in","r",stdin) using namespace std; const int uni=(1<<30)-1; int bin[31],tag[N<<2],val[N<<2]; struct data { int f0,f1,len; data() {f0=0,f1=0;} data operator+(const data b) const { data c; c.len=len+b.len; c.f0=f0,c.f1=f1; if(f0==len) c.f0+=b.f0; if(f1==len) c.f1+=b.f1; return c; } }s[N<<2]; void mark(int now,int v) { tag[now]=v; if(v==1) { s[now].f0=0; s[now].f1=s[now].len; } else { s[now].f0=s[now].len; s[now].f1=0; } if(s[now].len==1) { val[now]=(v?uni:0); } } void pushdown(int now) { if(tag[now]!=-1) { mark(lson,tag[now]); mark(rson,tag[now]); tag[now]=-1; } } void build(int l,int r,int now) { s[now].len=r-l+1; s[now].f0=s[now].len; s[now].f1=0; tag[now]=-1; if(l==r) { return; } int mid=(l+r)>>1; build(l,mid,lson),build(mid+1,r,rson); } void uptag(int l,int r,int now,int L,int R,int v) { if(l>=L&&r<=R) { mark(now,v); return; } pushdown(now); int mid=(l+r)>>1; if(L<=mid) uptag(l,mid,lson,L,R,v); if(R>mid) uptag(mid+1,r,rson,L,R,v); s[now]=s[lson]+s[rson]; } void upval(int l,int r,int now,int p,int v) { if(l==r) { val[now]+=v; if(val[now]<0) { val[now]+=bin[30]; } val[now]&=uni; int flag=(val[now]&1),p; s[now].f0=s[now].f1=0; if(flag) s[now].f1=1; else s[now].f0=1; for(int i=1;i<=29;++i) { p=(val[now]&(1<<i))>0; if(p^flag) break; if(flag) ++s[now].f1; else ++s[now].f0; } return; } pushdown(now); int mid=(l+r)>>1; if(p<=mid) upval(l,mid,lson,p,v); else upval(mid+1,r,rson,p,v); s[now]=s[lson]+s[rson]; } int qval(int l,int r,int now,int p) { if(l==r) return val[now]; pushdown(now); int mid=(l+r)>>1; if(p<=mid) return qval(l,mid,lson,p); else return qval(mid+1,r,rson,p); } data query(int l,int r,int now,int L,int R) { if(l>=L&&r<=R) { return s[now]; } pushdown(now); int mid=(l+r)>>1; if(L<=mid&&R>mid) return query(l,mid,lson,L,R)+query(mid+1,r,rson,L,R); else if(L<=mid) return query(l,mid,lson,L,R); else return query(mid+1,r,rson,L,R); } void init() { for(int i=0;i<31;++i) bin[i]=1<<i; } void ADD(int x,int y) { // x 块上加上 y int ori=qval(1,n,1,x); upval(1,n,1,x,y); if(ori+y>uni) { node p=query(1,n,1,x+1,n); if(p.f1) { uptag(1,n,1,x+1,x+p.f1,0); } upval(1,n,1,x+1+p.f1,1); } } void DEC(int x,int y) { int ori=qval(1,n,1,x); upval(1,n,1,x,-y); if(ori-y<0) { node p=query(1,n,1,x+1,n); if(p.f0) { uptag(1,n,1,x+1,x+p.f0,1); } upval(1,n,1,x+1+p.f0,-1); } } int main() { setIO("input"); init(); int m,x,y,z; scanf("%d%d%d%d",&m,&x,&y,&z); for(int i=1;i<=m;++i) { scanf("%d",&z); if(z==1) { scanf("%d%d",&x,&y); if(!x) continue; int rx=abs(x); } else { scanf("%d",&x); } } return 0; }