因为题目说了 2 l r 操作保证 r 小于当前操作编号, 于是我们可以先把所有操作存起来再倒着做.
sum[n] 用来存储第 i 次操作执行了几次, 用差分实现.
ans[n] 用来存储数组的值, 用差分来更新.

#include <bits/stdc++.h>
using namespace std;

#define mem(a, b) memset(a, b, sizeof(a))
#define PI acos(-1)
#define debug(a) cout << (a) << endl
typedef long long ll;
int dir8[8][2] = { { 1, 0 }, { 0, 1 }, { -1, 0 }, { 0, -1 }, { 1, 1 }, { 1, -1 }, { -1, 1 }, { -1, -1 } };
int dir4[4][2] = { 1, 0, 0, 1, -1, 0, 0, -1 };
const int INF = 0x3f3f3f3fLL;
const long long LLF = 0x3f3f3f3f3f3f3f3fLL;
const int maxn = 1e5 + 15;
const int mod = 1e9 + 7;

ll ans[maxn], sum[maxn];
int opt[maxn], l[maxn], r[maxn];
int main()
{
    int n, m;
    cin >> n >> m;
    for (int i = 1; i <= m; i++)
        cin >> opt[i] >> l[i] >> r[i];
    for (int i = m; i; i--) {
        sum[i] = (sum[i] + sum[i + 1]) % mod;
        if (opt[i] == 1) {
            ans[l[i]] = (ans[l[i]] + sum[i] + 1) % mod;
            ans[r[i] + 1] = (ans[r[i] + 1] - sum[i] - 1 + mod) % 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;
        }
    }
    for (int i = 1; i <= n; i++) {
        ans[i] = (ans[i] + ans[i - 1]) % mod;
        cout << ans[i] << " ";
    }
    return 0;
}