分析

观察题目可以发现题目要求维护两种数组的区间加

  • Opt==2时,将操作区间加一
  • Opt==1时,将数组范围内的数加一

我们还发现,第一种区间加,会影响第二种区间加
所以我们在维护第一种区间加的基础上再维护第二种区间加
并且我们发现第一种区间加会影响它之前的询问
所以我们需要倒叙维护每个操作的次数
由于是区间加,并且需要遍历数组,所以我们直接考虑差分即可
最后再来从头到尾扫一次数的差分数组
即可得到答案
温馨提示:到处都要记得取模,否则/xyx

代码

//Nowcoder 25737
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>

#define LL long long
#define Cl(X,Y) memset((X),(Y),sizeof(X))
#define FOR(i,A,B) for(LL i=A;i<=B;i++)
#define BOR(i,A,B) for(LL i=A;i>=B;i--)
#define Lowbit(X) (X & (-X))
#define Skip cout<<endl;
#define INF 0x3f3f3f3f
#define Mod 1000000007
#define Rson (X<<1|1)
#define Lson (X<<1)
using namespace std;
const LL MaxN=1e5+10;

LL Total,Test;
LL Cnt_one[MaxN],Cnt_two[MaxN];
struct Node {
    LL L,R,Opt;
}Sig[MaxN];

inline void File() {
    freopen(".in","r",stdin);
    freopen(".out","w",stdout);
}

signed main() {
    // File();
    ios::sync_with_stdio(false);
    cin>>Total>>Test;
    FOR(i,1,Test) cin>>Sig[i].Opt>>Sig[i].L>>Sig[i].R;
    LL New=0;
    BOR(i,Test,1) {
        (New+=Cnt_one[i])%=Mod;
        if(Sig[i].Opt==1) { (Cnt_two[Sig[i].L]+=New+1)%=Mod; (Cnt_two[Sig[i].R+1]-=New+1)%=Mod; }
        else { (Cnt_one[Sig[i].R]+=New+1)%=Mod; (Cnt_one[Sig[i].L-1]-=New+1)%=Mod; }
    }
    // FOR(i,1,Test) { cout<<"i: "<<i<<" Cnt_one[]: "<<Cnt_one[i]<<endl; }
    New=0;
    FOR(i,1,Total) {
        (New+=Cnt_two[i])%=Mod;
        cout<<(New%Mod+Mod)%Mod<<" ";
    }
    cout<<endl;
    // fclose(stdin);
    // fclose(stdout);
    system("pause");
    return 0;
}