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 ",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; }