题意

给你一个初始值为的序列。你现在有两种操作,一是给的区间加;二是再执行一遍第次到第次的操作。

思路

两次差分。第一次为处理第二种操作,我们定义为第次操作要执行的次数,用差分实现。第二次是处理区间加,也可以用差分。

所以,差分就对啦!

代码

#include<bits/stdc++.h>
#define ll long long
const int N=1e5+5,INF=0x3f3f3f3f,mod=1e9+7;
using namespace std;

int n,m;
int opt[N],l[N],r[N],ans[N],sum[N];

inline int read()
{
    register int x=0,f=1;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
    return x*f;
}

int main()
{
    n=read();m=read();
    for(int i=1;i<=m;i++)
        opt[i]=read(),l[i]=read(),r[i]=read();
    for(int i=m;i>=1;i--) 
    {
        sum[i]+=sum[i+1];
        sum[i]%=mod;
        if(opt[i]==1) 
            ans[r[i]+1]=(ans[r[i]+1]-sum[i]-1+mod)%mod,
            ans[l[i]]=(ans[l[i]]+sum[i]+1)%mod;
        else
            sum[l[i]-1]=(sum[l[i]-1]-sum[i]-1+mod)%mod,
            sum[r[i]]=(sum[r[i]]+sum[i]+1)%mod;
   }
   int now=0;
   for(int i=1;i<=n;i++)
   {
           now+=ans[i];
           now%=mod;
           printf("%d ",now);
   }
    return 0;
}