离散化test

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6+11;
int ll[maxn],rr[maxn],mark[maxn];
int ra[maxn],n,q;
int sz[maxn],ssz[maxn];
#define rep(i,j,k) for(int i = j; i <= k; i++)
#define scan(a) scanf("%d",&a)
#define scann(a,b) scanf("%d%d",&a,&b)
#define println(a) printf("%d\n",a)
struct ST{
    int sum[maxn<<2],lazy[maxn<<2];
    #define lc o<<1
    #define rc o<<1|1
    void init(){memset(lazy,-1,sizeof lazy);}
    void pu(int o){sum[o]=sum[lc]+sum[rc];}
    void pd(int o,int l,int r){
        if(~lazy[o]){
            lazy[lc]=lazy[rc]=lazy[o];
            int m = l+r>>1;
            sum[lc]=(ra[m]-ra[l]+1)*lazy[o];
            sum[rc]=(ra[r]-ra[m+1]+1)*lazy[o];
            lazy[o]=-1;
        }
    }
    void build(int o,int l,int r){
        if(l==r){
            sum[o]=1;
            return;
        }
        int m = l+r>>1;
        build(lc,l,m);
        build(rc,m+1,r);
        pu(o);
    }
    void update(int o,int l,int r,int L,int R,int v){
        if(L<=l&&r<=R){
            sum[o]=(ra[r]-ra[l]+1)*v;
            lazy[o]=v;
            return;
        }
        pd(o,l,r);
        int m = l+r>>1;
        if(L<=m) update(lc,l,m,L,R,v);
        if(R>m) update(rc,m+1,r,L,R,v);
        pu(o);
    }
    int query(int o,int l,int r,int L,int R){
        if(L<=l&&r<=R) return sum[o];
        pd(o,l,r);
        int m = l+r>>1;
        int ans=0;
        if(L<=m) ans+=query(lc,l,m,L,R);
        if(R>m) ans+=query(rc,m+1,r,L,R);
        return ans;
    }
}st;
int main(){
    while(scann(n,q)^-1){
        rep(i,1,q) {scann(ll[i],rr[i]); scan(mark[i]);}
        rep(i,1,q) {ra[i]=ll[i]; ra[i+q]=rr[i];}
        sort(ra+1,ra+2*q+1);
        int qq = unique(ra+1,ra+2*q+1)-ra-1;
        
        // rep(i,1,qq) cout<<ra[i]<<" ";cout<<endl;
        
        rep(i,1,q) ll[i]=lower_bound(ra+1,ra+qq+1,ll[i])-ra,rr[i]=lower_bound(ra+1,ra+qq+1,rr[i])-ra;
        
        // rep(i,1,qq) cout<<ll[i]<<" "<<rr[i]<<endl;
        
        rep(i,1,qq-1) sz[i]=ra[i+1]-ra[i];sz[qq]=ra[qq]?1:0;
        // rep(i,1,qq) ra[i]=ra[i-1]+sz[i];
        // for(int i = qq; i <= )
        
        rep(i,1,qq) cout<<ra[i]<<" ";cout<<endl;
        
        st.init();st.build(1,1,qq);
        // ra[0]=0; rep(i,1,qq) ra[i]+=ra[i-1];
        rep(i,1,q) cout<<ll[i]<<" "<<rr[i]<<" "<<mark[i]<<endl;
        
        rep(i,1,q){
            st.update(1,1,qq,ll[i],rr[i],(mark[i]==1?0:1));
            println(st.query(1,1,qq,1,qq));
        }
    }
    return 0;
}
posted @ 2018-01-14 10:41  Caturra  阅读(175)  评论(0)    收藏  举报