codechef September Challenge 2017 Sereja and Commands
————————————————————————————
这道题维护一下原序列的差分以及操作的差分就可以了
记得倒着差分操作 因为题目保证操作2的l r 小与当前位置
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<cstdio> #include<cstring> #include<algorithm> #define lowbit(x) x&-x; using namespace std; const int M=1e5+7,mod=1e9+7; int read(){ int ans=0,f=1,c=getchar(); while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();} while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();} return ans*f; } int T,n,m; int s[M],f[M]; struct pos{int k,l,r;}q[M]; void clear(){ memset(s,0,sizeof(s)); memset(f,0,sizeof(f)); } int main(){ T=read(); while(T--){ n=read(); m=read(); clear(); for(int i=1;i<=m;i++) q[i].k=read(),q[i].l=read(),q[i].r=read(); f[m]=1; for(int i=m;i;i--){ int k=q[i].k,l=q[i].l,r=q[i].r; if(k==1){ s[l]=(s[l]+f[i])%mod; s[r+1]=(s[r+1]-f[i])%mod; } else{ f[l-1]=(f[l-1]-f[i])%mod; f[r]=(f[r]+f[i])%mod; } f[i-1]=(f[i-1]+f[i])%mod; } int sum=0; for(int i=1;i<=n;i++) sum=(sum+s[i])%mod,printf("%d ",(sum+mod)%mod); puts(""); } return 0; }