func_code_string: #include <bits/stdc++.h>   using namespace std;   #pragma comment(linker,  /stack:200000000 )   #pragma GCC optimize( Ofast )   #pragma GCC target( sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native )   const long long mod = 1e9 + 7;   class matrix {    public:     vector<vector<long long> > v;     matrix() { v = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}}; }     vector<long long>& operator[](long long loc) { return v[loc]; }   };   matrix mult(matrix a, matrix b) {     matrix c;     for (long long i = 0; i < 3; i++)       for (long long j = 0; j < 3; j++) {         c.v[i][j] = 0;         for (long long k = 0; k < 3; k++)           c.v[i][j] = (c.v[i][j] + a.v[i][k] * b.v[k][j]) % mod;       }     return c;   }   matrix power(matrix base, long long expo) {     matrix ans;     while (expo) {       if (expo & 1) {         ans = mult(base, ans);       }       base = mult(base, base);       expo = expo >> 1;     }     return ans;   }   int32_t main() {     ios::sync_with_stdio(false);     cin.tie(0);     long long n, m;     cin >> n >> m;     vector<long long> b(4, 0);     vector<pair<pair<long long, long long>, long long> > v(n);     multiset<pair<long long, long long> > s;     for (long long i = 0; i < n; i++) {       cin >> v[i].second >> v[i].first.first >> v[i].first.second;       s.insert({v[i].first.first, v[i].second});       s.insert({v[i].first.second + 1, -v[i].second});     }     long long prev = 1;     matrix ans, c;     c[0] = {1, 1, 0};     c[1] = {1, 1, 1};     c[2] = {0, 1, 1};     for (auto& i : s) {       long long loc = abs(i.second);       long long curr = i.first - 1;       if (curr > prev) {         ans = mult(power(c, curr - prev), ans);         prev = curr;       }       long long val = i.second / loc;       loc--;       b[loc] += val;       if (b[loc] <= 0) {         c[loc] = {loc != 2, 1, loc != 0};       } else {         c[loc] = {0, 0, 0};       }     }     ans = mult(power(c, m - prev), ans);     cout << ans[1][1];     return 0;   }   