草稿

#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; 
}

  

原文地址:https://www.cnblogs.com/guangheli/p/12054321.html