【UNR #1】火车管理

SOL:

 可持久化数据结构了解一下。

#include<bits/stdc++.h>
#define N 4000021
#define M (N*25)
#define Mid (l+r>>1)
#define Ls no<<1,l,Mid
#define Rs no<<1|1,Mid+1,r
using namespace std;
int ans,pre[N],rt[N],lazy[N];
struct Q_tree{
    int lazy[M],tot,ls[M],rs[M];
    void down(int id){
        if (-1==lazy[id]) return;
        ++tot; lazy[tot]=lazy[id];ls[tot]=ls[ls[id]];rs[tot]=rs[ls[id]];ls[id]=tot;
        ++tot; lazy[tot]=lazy[id];ls[tot]=ls[rs[id]];rs[tot]=rs[rs[id]];rs[id]=tot;
        lazy[id]=-1;
    }
    void que(int now,int l,int r,int x){
        if (~lazy[now]||!now) {ans=lazy[now]; return; }
        if (x<=Mid) que(ls[now],l,Mid,x);
        else que(rs[now],Mid+1,r,x);
    }
    void change(int last,int& now,int l,int r,int L,int R,int to){
        now=++tot;
        if (L<=l&&r<=R) {lazy[now]=to; return;}
        if (last) down(last);
        ls[now]=ls[last],rs[now]=rs[last];
        if (L<=Mid) change(ls[last],ls[now],l,Mid,L,R,to);
        if (R> Mid) change(rs[last],rs[now],Mid+1,r,L,R,to);
    }
}Q;
inline void push(int no,int l,int r){
    if (lazy[no]==-1) return;
    lazy[no<<1]=lazy[no<<1|1]=lazy[no];
    pre[no<<1]=lazy[no]*(Mid-l+1); pre[no<<1|1]=lazy[no]*(r-Mid); 
    lazy[no]=-1;
}
void que(int no,int l,int r,int L,int R){
    if (L<=l&&r<=R) {ans+=pre[no];return;}
    push(no,l,r);
    if (L<=Mid) que(Ls,L,R);
    if (R >Mid) que(Rs,L,R);
}
void change(int no,int l,int r,int L,int R,int o){
    if (L<=l&&r<=R) {
        pre[no]=(r-l+1)*o; lazy[no]=o;
        return;
    }
    push(no,l,r);
    if (L<=Mid) change(Ls,L,R,o);
    if (R> Mid) change(Rs,L,R,o); 
    pre[no]=pre[no<<1]+pre[no<<1|1];
}
void out(int no,int l,int r){
    if (l==r) {printf("%d ",pre[no]); return;}
    push(no,l,r);
    out(Ls); out(Rs);
}
int n,m,tj,op,l,r,last,Pow[N>>1];
signed main () {
//    freopen("ex.in","r",stdin);
//    freopen("ex.out","w",stdout);
    memset(lazy,-1,sizeof lazy);
    memset(Q.lazy,-1,sizeof Q.lazy);
    scanf("%d%d%d",&n,&m,&tj);
    for (int t=1;t<=m;t++){
        scanf("%d",&op);
        if (op==1) {
            scanf("%d%d",&l,&r);
            l=(l+last*tj)%n+1;
            r=(r+last*tj)%n+1;
            if (l>r) swap(l,r);
            ans=0;
            que(1,1,n,l,r);
            rt[t]=rt[t-1];
            printf("%d\n",last=ans);
        }
        if (op==2) {
            scanf("%d",&l);
            l=(l+last*tj)%n+1;
            Q.que(rt[t-1],1,n,l);
            if (ans==-1) {rt[t]=rt[t-1]; continue;}
            Q.que(rt[ans-1],1,n,l);
            Q.change(rt[t-1],rt[t],1,n,l,l,ans);
            change(1,1,n,l,l,Pow[ans]);
        }
        if (op==3) {
            scanf("%d%d%d",&l,&r,&Pow[t]);
            l=(l+last*tj)%n+1;
            r=(r+last*tj)%n+1;
            if (l>r) swap(l,r);
            change(1,1,n,l,r,Pow[t]);
            Q.change(rt[t-1],rt[t],1,n,l,r,t);
        }
//        out(1,1,n); puts("");
    }
    return 0;
} 

 

posted @ 2018-07-19 14:49  泪寒之雪  阅读(267)  评论(0编辑  收藏  举报