拿线段树随便搞搞就好了
并非原题代码:
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m,cnt,tot,tmp; int cg[8]; int st[100005]; struct node{ int num[8]; int tag; }tr[100000*4+5]; void pushup(int u){ for(int i=1;i<=7;i++){ tr[u].num[i]=tr[u*2].num[i]+tr[u*2+1].num[i]; } } void pushdown(int u,int l,int r){ int mid=(l+r)>>1; if(l==r)tr[u].tag=0; if(tr[u].tag==1){ for(int j=1;j<=7;j++){ tr[u*2].num[j]=tr[u*2+1].num[j]=0; } int i; int num=mid-l+1; for(i=1;i<=7;i++){ if(num<=tr[u].num[i]){ tr[u*2].num[i]=num; break; } else{ num-=tr[u].num[i]; tr[u*2].num[i]=tr[u].num[i]; } } for(i;i<=7;i++){ if(num){ tr[u*2+1].num[i]=tr[u].num[i]-num; num=0; }else{ tr[u*2+1].num[i]=tr[u].num[i]; } } } if(tr[u].tag==2){ for(int j=1;j<=7;j++){ tr[u*2].num[j]=tr[u*2+1].num[j]=0; } int i; int num=r-mid; for(i=1;i<=7;i++){ if(num<=tr[u].num[i]){ tr[u*2+1].num[i]=num; break; }else{ num-=tr[u].num[i]; tr[u*2+1].num[i]=tr[u].num[i]; } } for(i;i<=7;i++){ if(num){ tr[u*2].num[i]=tr[u].num[i]-num; num=0; }else{ tr[u*2].num[i]=tr[u].num[i]; } } } if(tr[u].tag)tr[u*2].tag=tr[u*2+1].tag=tr[u].tag; tr[u].tag=0; } void build(int u,int l,int r){ if(l==r){ tr[u].num[st[l]]++; return; } int mid=(l+r)>>1; build(u*2,l,mid); build(u*2+1,mid+1,r); pushup(u); } void pre_add(int u,int l,int r,int ql,int qr){ if(ql>r||qr<l){ return; } int mid=(l+r)>>1; if(ql<=l&&qr>=r){ for(int i=1;i<=7;i++){ cg[i]+=tr[u].num[i]; } return; } pushdown(u,l,r); pre_add(u*2,l,mid,ql,qr); pre_add(u*2+1,mid+1,r,ql,qr); } void change(int u,int l,int r,int ql,int qr,int v){ if(ql>r||qr<l){ return; } int mid=(l+r)>>1; if(ql<=l&&qr>=r){ tr[u].tag=v; if(v==1){ for(int i=1;i<=7;i++){ tr[u].num[i]=0; } int cn=r-l+1; for(int i=1;i<=7;i++){ if(cn<=cg[i]){ tr[u].num[i]=cn; cg[i]-=cn; cn=0; } else{ tr[u].num[i]=cg[i]; cn-=cg[i]; cg[i]=0; } } } if(v==2){ for(int i=1;i<=7;i++){ tr[u].num[i]=0; } int cn=r-l+1; for(int i=7;i>=1;i--){ if(cn<=cg[i]){ tr[u].num[i]=cn; cg[i]-=cn; cn=0; } else{ tr[u].num[i]=cg[i]; cn-=cg[i]; cg[i]=0; } } } pushdown(u,l,r); return; } pushdown(u,l,r); change(u*2,l,mid,ql,qr,v); change(u*2+1,mid+1,r,ql,qr,v); pushup(u); } void query(int u,int l,int r){ pushdown(u,l,r); if(l==r){ for(int i=1;i<=7;i++){ if(tr[u].num[i])printf("%d ",i); } return; } int mid=(l+r)>>1; query(u*2,l,mid); query(u*2+1,mid+1,r); } int main(){ //freopen("third.in","r",stdin); //freopen("third.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ scanf("%d",&st[i]); } build(1,1,n); for(int i=1;i<=m;i++){ int l,r,v; scanf("%d%d%d",&l,&r,&v); pre_add(1,1,n,l,r); change(1,1,n,l,r,v+1); } query(1,1,n); printf(" "); return 0; }