// ROOT : DRAGON3012009
#include <bits/stdc++.h>
#define ll unsigned long long
#define ld long double
#define el "\n"
#define fast ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define __ROOT__ int main()
#pragma GCC optimize("O2")
//#pragma GCC optimize("unroll-loops")
//#pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define fi first
#define se second
#define M 1000000007
#define MAXN 200001
#define INF (1ll<<30)
#define BLOCK_SIZE 425
#define MAX_NODE 1001001
#define LOG 18
#define ALPHA_SIZE 26
#define BASE 256
#define NAME "file"
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
using namespace std;
using namespace chrono ;
const ll MOD[] = {(ll)1e9 + 2277, (ll)1e9 + 5277, (ll)1e9 + 8277, (ll)1e9 + 9277, (ll) 1e9 + 7 };
const ll NMOD = 1;
const int dx[] = {-1, 0, 1,0};
const int dy[] = {0, 1, 0, -1};
//**Variable**//
ll n, q ;
ll arr[MAXN];
//**Struct**//
ll add(ll a, ll b ) {
return (a + b ) % M ;
}
ll mul(ll a, ll b ) {
return a * b % M ;
}
struct Seg {
ll val[MAXN << 2 ], lazy[MAXN << 2 ] ;
void fix(ll id, ll l, ll r ) {
if(lazy[id]) {
val[id] = add(val[id], mul(r - l + 1, lazy[id])) ;
if(l!= r ) {
lazy[id<<1] = add(lazy[id << 1], lazy[id]) ;
lazy[id<<1|1] = add(lazy[id << 1 |1 ], lazy[id]) ;
}
lazy[id] = 0 ;
}
}
void update(ll id, ll l, ll r, ll u, ll v, ll value ) {
fix(id, l, r) ;
if(u > r || v < l ) return ;
if(u<= l && v >= r ) {
lazy[id] = add(lazy[id], value) ;
fix(id, l, r) ;
return ;
}
ll m = l + r >> 1;
update(id << 1, l, m, u, v, value) ;
update(id << 1 | 1, m + 1, r, u, v, value ) ;
val[id] =add(val[id << 1], val[id << 1 | 1 ]) ;
}
ll get(ll id, ll l, ll r, ll u, ll v ) {
fix(id, l, r) ;
if(u > r || v < l ) return 0 ;
if(u<= l && v >= r ) return val[id] ;
ll m = l + r >> 1;
return add(get(id << 1, l, m, u, v), get(id << 1 | 1, m + 1, r, u, v) ) ;
}
} seg[3];
//**Function**//
template<class X, class Y >
bool minimize(X & x, const Y &y ) {
return x > y ? x = y, 1:0 ;
}
template<class X, class Y >
bool maximize(X &x, const Y &y ) {
return x < y ? x = y, 1:0 ;
}
struct Que {
ll l, r, type ;
} que[MAXN] ;
void init() {
cin>>n >> q ;
FOR(i, 1, q ) {
cin >> que[i].type >> que[i].l >> que[i].r ;
}
}
void solve() {
FORD(i, q, 1 ) {
ll t = seg[2].get(1, 1, q, i, i ) + 1 ;
if(que[i].type == 2 ) {
seg[2].update(1, 1, q, que[i].l , que[i].r, t % M ) ;
}
}
FOR(i, 1, q ) {
ll freg = seg[2].get(1, 1, q, i, i ) ;
if(que[i].type == 1 ) {
seg[1].update(1, 1, n, que[i].l, que[i].r, add(freg , 1 ) ) ;
}
}
FOR(i, 1, n ) cout << seg[1].get(1,1, n, i, i) << " " ;
}
__ROOT__ {
// freopen(NAME".inp" , "r" , stdin);
// freopen(NAME".out" , "w", stdout) ;
fast;
int t = 1; // cin >> t ;
while(t--) {
init();
solve();
}
return (0&0);
}
Ly8gUk9PVCA6IERSQUdPTjMwMTIwMDkKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgbGQgbG9uZyBkb3VibGUKI2RlZmluZSBlbCAiXG4iCiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBfX1JPT1RfXyBpbnQgbWFpbigpCiNwcmFnbWEgR0NDIG9wdGltaXplKCJPMiIpCi8vI3ByYWdtYSBHQ0Mgb3B0aW1pemUoInVucm9sbC1sb29wcyIpCi8vI3ByYWdtYSBHQ0MgdGFyZ2V0KCJhdngyLGJtaSxibWkyLHBvcGNudCxsemNudCIpCiNkZWZpbmUgRk9SKGksbCxyKSBmb3IoaW50IGkgPSBsIDsgaSA8PSByIDsgaSArKykKI2RlZmluZSBGT1JEKGkscixsKSBmb3IoaW50IGkgPSByIDsgaSA+PSBsIDsgaSAtLSkKI2RlZmluZSBSRVAoaSwgYSApIGZvcihpbnQgaSA9IDAgOyBpIDwgYSA7IGkgKysgKQojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgTSAxMDAwMDAwMDA3CiNkZWZpbmUgTUFYTiAyMDAwMDEKI2RlZmluZSBJTkYgKDFsbDw8MzApCiNkZWZpbmUgQkxPQ0tfU0laRSA0MjUKI2RlZmluZSBNQVhfTk9ERSAxMDAxMDAxCiNkZWZpbmUgTE9HIDE4CiNkZWZpbmUgQUxQSEFfU0laRSAyNgojZGVmaW5lIEJBU0UgMjU2CiNkZWZpbmUgTkFNRSAiZmlsZSIKI2RlZmluZSBjb21wYXJlKHYpIHNvcnQoKHYpLmJlZ2luKCksICh2KS5lbmQoKSk7ICh2KS5lcmFzZSh1bmlxdWUoKHYpLmJlZ2luKCksICh2KS5lbmQoKSksICh2KS5lbmQoKSk7CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIG5hbWVzcGFjZSBjaHJvbm8gOwpjb25zdCBsbCBNT0RbXSA9IHsobGwpMWU5ICsgMjI3NywgKGxsKTFlOSArIDUyNzcsIChsbCkxZTkgKyA4Mjc3LCAobGwpMWU5ICsgOTI3NywgKGxsKSAxZTkgKyA3IH07CmNvbnN0IGxsIE5NT0QgPSAxOwpjb25zdCBpbnQgZHhbXSA9IHstMSwgMCwgMSwwfTsKY29uc3QgaW50IGR5W10gPSB7MCwgMSwgMCwgLTF9OwovLyoqVmFyaWFibGUqKi8vCmxsIG4sIHEgOwpsbCBhcnJbTUFYTl07Ci8vKipTdHJ1Y3QqKi8vCmxsIGFkZChsbCBhLCBsbCBiICkgewogICAgcmV0dXJuIChhICsgYiApICUgTSA7Cn0KbGwgbXVsKGxsIGEsIGxsIGIgKSB7CiAgICByZXR1cm4gYSAqIGIgJSBNIDsKfQpzdHJ1Y3QgU2VnIHsKICAgIGxsIHZhbFtNQVhOIDw8IDIgXSwgbGF6eVtNQVhOIDw8IDIgXSA7CiAgICB2b2lkIGZpeChsbCBpZCwgbGwgbCwgbGwgciApIHsKICAgICAgICBpZihsYXp5W2lkXSkgewogICAgICAgICAgICB2YWxbaWRdID0gYWRkKHZhbFtpZF0sIG11bChyIC0gbCArIDEsIGxhenlbaWRdKSkgOwogICAgICAgICAgICBpZihsIT0gciApIHsKICAgICAgICAgICAgICAgIGxhenlbaWQ8PDFdID0gYWRkKGxhenlbaWQgPDwgMV0sIGxhenlbaWRdKSA7CiAgICAgICAgICAgICAgICBsYXp5W2lkPDwxfDFdID0gYWRkKGxhenlbaWQgPDwgMSB8MSBdLCBsYXp5W2lkXSkgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhenlbaWRdID0gMCA7CiAgICAgICAgfQogICAgfQogICAgdm9pZCB1cGRhdGUobGwgaWQsIGxsIGwsIGxsIHIsIGxsIHUsIGxsIHYsIGxsIHZhbHVlICApIHsKICAgICAgICBmaXgoaWQsIGwsIHIpIDsKICAgICAgICBpZih1ID4gciB8fCB2IDwgbCApIHJldHVybiA7CiAgICAgICAgaWYodTw9IGwgJiYgdiA+PSByICkgewogICAgICAgICAgICBsYXp5W2lkXSA9IGFkZChsYXp5W2lkXSwgIHZhbHVlKSA7CiAgICAgICAgICAgIGZpeChpZCwgbCwgcikgOwogICAgICAgICAgICByZXR1cm4gOwogICAgICAgIH0KICAgICAgICBsbCBtID0gbCArIHIgPj4gMTsKICAgICAgICB1cGRhdGUoaWQgPDwgMSwgbCwgbSwgdSwgdiwgdmFsdWUpIDsKICAgICAgICB1cGRhdGUoaWQgPDwgMSB8IDEsIG0gKyAxLCByLCB1LCB2LCB2YWx1ZSApIDsKICAgICAgICB2YWxbaWRdID1hZGQodmFsW2lkIDw8IDFdLCB2YWxbaWQgPDwgMSB8IDEgXSkgOwogICAgfQogICAgbGwgZ2V0KGxsIGlkLCBsbCBsLCBsbCByLCBsbCB1LCBsbCB2ICkgewogICAgICAgIGZpeChpZCwgbCwgIHIpIDsKICAgICAgICBpZih1ID4gciB8fCB2IDwgbCApIHJldHVybiAwIDsKICAgICAgICBpZih1PD0gbCAmJiB2ID49IHIgKSAgcmV0dXJuIHZhbFtpZF0gOwogICAgICAgIGxsIG0gPSBsICsgciA+PiAxOwogICAgICAgIHJldHVybiBhZGQoZ2V0KGlkIDw8IDEsIGwsIG0sIHUsIHYpLCBnZXQoaWQgPDwgMSB8IDEsICBtICsgMSwgciwgdSwgdikgKSA7CiAgICB9Cn0gc2VnWzNdOwovLyoqRnVuY3Rpb24qKi8vCnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFkgPgpib29sIG1pbmltaXplKFggJiB4LCBjb25zdCBZICZ5ICkgewogICAgcmV0dXJuIHggPiB5ID8geCA9IHksIDE6MCA7Cn0KdGVtcGxhdGU8Y2xhc3MgWCwgY2xhc3MgWSA+CmJvb2wgbWF4aW1pemUoWCAmeCwgY29uc3QgWSAmeSApIHsKICAgIHJldHVybiB4IDwgeSA/IHggPSB5LCAxOjAgOwp9CnN0cnVjdCBRdWUgewogICAgbGwgbCwgciwgdHlwZSA7Cn0gcXVlW01BWE5dIDsKdm9pZCBpbml0KCkgewogICAgY2luPj5uID4+IHEgIDsKICAgIEZPUihpLCAxLCBxICkgewogICAgICAgIGNpbiA+PiBxdWVbaV0udHlwZSA+PiBxdWVbaV0ubCA+PiBxdWVbaV0uciA7CiAgICB9Cn0KCnZvaWQgc29sdmUoKSB7CiAgICBGT1JEKGksIHEsIDEgKSB7CiAgICAgICAgbGwgdCA9IHNlZ1syXS5nZXQoMSwgMSwgcSwgaSwgaSApICsgMSA7CiAgICAgICAgaWYocXVlW2ldLnR5cGUgPT0gMiApIHsKICAgICAgICAgICAgc2VnWzJdLnVwZGF0ZSgxLCAgMSwgIHEsIHF1ZVtpXS5sICwgcXVlW2ldLnIsIHQgJSBNICkgIDsKICAgICAgICB9CiAgICB9CiAgICBGT1IoaSwgMSwgcSApIHsKICAgICAgICBsbCBmcmVnID0gc2VnWzJdLmdldCgxLCAxLCBxLCBpLCBpICkgIDsKICAgICAgICBpZihxdWVbaV0udHlwZSA9PSAxICkgewogICAgICAgICAgICBzZWdbMV0udXBkYXRlKDEsIDEsIG4sIHF1ZVtpXS5sLCBxdWVbaV0uciwgYWRkKGZyZWcgLCAxICkgKSA7CiAgICAgICAgfQogICAgfQogICAgRk9SKGksIDEsIG4gKSBjb3V0IDw8IHNlZ1sxXS5nZXQoMSwxLCBuLCAgaSwgaSkgPDwgIiAiICA7Cn0KCl9fUk9PVF9fIHsKICAgIC8vIGZyZW9wZW4oTkFNRSIuaW5wIiAsICJyIiAsIHN0ZGluKTsKICAgIC8vIGZyZW9wZW4oTkFNRSIub3V0IiAsICJ3Iiwgc3Rkb3V0KSA7CiAgICBmYXN0OwogICAgaW50IHQgPSAxOyAvLyBjaW4gPj4gdCA7CiAgICB3aGlsZSh0LS0pIHsKICAgICAgICBpbml0KCk7CiAgICAgICAgc29sdmUoKTsKICAgIH0KICAgIHJldHVybiAoMCYwKTsKfQo=