NC25737(筱玛爱线段树 )
感受
思路
#include <bits/stdc++.h> #define ls o << 1 #define rs o << 1 | 1 using namespace std; typedef long long ll; const int maxn = 1e5 + 10; const ll mod = 1e9 + 7; struct Inf{ int opt, l, r; }inf[maxn]; ll lazy[2][maxn << 2]; int n, m; void build(int o, int l, int r, int opt){ if(l == r){ if(!opt){ lazy[opt][o] = 1; } else{ lazy[opt][o] = 0; } return ; } int mid = (l + r) / 2; build(ls, l, mid, opt); build(rs, mid + 1, r, opt); } void push(int o, int opt){ if(lazy[opt][o]){ lazy[opt][ls] += lazy[opt][o]; lazy[opt][ls] %= mod; lazy[opt][rs] += lazy[opt][o]; lazy[opt][rs] %= mod; lazy[opt][o] = 0; } } ll query(int o, int l, int r, int k, int opt){ if(l == r){ return lazy[opt][o]; } push(o, opt); int mid = (l + r) / 2; if(mid >= k) return query(ls, l, mid, k, opt); else return query(rs, mid + 1, r, k, opt); } void update(int o, int l, int r, int x, int y, ll k, int opt){ if(l >= x && y >= r){ lazy[opt][o] += k; lazy[opt][o] %= mod; return ; } push(o, opt); int mid = (l + r) / 2; if(mid >= x) update(ls, l, mid, x, y, k, opt); if(y > mid) update(rs, mid + 1, r, x, y, k, opt); } ll ans[maxn]; int main(){ scanf("%d%d", &n, &m); for(int i = 1; i <= m; i++){ scanf("%d%d%d", &inf[i].opt, &inf[i].l, &inf[i].r); } build(1, 1, m, 0); build(1, 1, n, 1); for(int i = m; i >= 1; i--){ if(inf[i].opt == 2){ ll k = query(1, 1, m, i, 0); update(1, 1, m, inf[i].l, inf[i].r, k, 0); } } for(int i = 1; i <= m; i++){ if(inf[i].opt == 1){ ll k = query(1, 1, m, i, 0); update(1, 1, n, inf[i].l, inf[i].r, k, 1); } } for(int i = 1; i <= n; i++){ ans[i] = query(1, 1, n, i, 1); } for(int i = 1; i <= n; i++){ printf("%lld%c", ans[i], i == n ? '\n' : ' '); } return 0; }