func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T1, typename T2>   bool mini(T1 &a, T2 b) {     if (a > b) {       a = b;       return true;     }     return false;   }   template <typename T1, typename T2>   bool maxi(T1 &a, T2 b) {     if (a < b) {       a = b;       return true;     }     return false;   }   const int N = 2e5 + 5;   const int oo = 1e9;   struct segtree {     int n;     vector<int> st;     vector<int> lz;     segtree(int _n) {       n = _n;       st.assign(4 * n + 5, 0);       lz.assign(4 * n + 5, 0);     }     void push(int id) {       for (int i = (id << 1); i <= (id << 1 | 1); i++) {         st[i] += lz[id];         lz[i] += lz[id];       }       lz[id] = 0;     }     void update(int id, int l, int r, int u, int v, int val) {       if (l > v || r < u) return;       if (l >= u && r <= v) return (void)(st[id] += val, lz[id] += val);       int mid = (l + r) >> 1;       push(id);       update(id << 1, l, mid, u, v, val);       update(id << 1 | 1, mid + 1, r, u, v, val);       st[id] = max(st[id << 1], st[id << 1 | 1]);     }     void update(int l, int r, int val) { update(1, 1, n, l, r, val); }     int getmax(int id, int l, int r, int u, int v) {       if (l > v || r < u) return 0;       if (l >= u && r <= v) return st[id];       int mid = (l + r) >> 1;       int lnode = getmax(id << 1, l, mid, u, v);       int rnode = getmax(id << 1 | 1, mid + 1, r, u, v);       return max(lnode, rnode);     }     int getmax(int l, int r) { return getmax(1, 1, n, l, r); }   };   segtree st[2] = {segtree(N << 1), segtree(N << 1)};   vector<int> r[2][N << 1];   pair<int, int> seg[N];   int dp[2][N << 1];   int c[N];   int n;   bool upd[2][N << 1];   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> n;     vector<int> val;     for (int i = 1; i <= n; i++) {       cin >> seg[i].first >> seg[i].second >> c[i];       c[i]--;       val.push_back(seg[i].first);       val.push_back(seg[i].second);     }     sort(val.begin(), val.end());     val.resize(unique(val.begin(), val.end()) - val.begin());     for (int i = 1; i <= n; i++) {       seg[i].first =           lower_bound(val.begin(), val.end(), seg[i].first) - val.begin() + 1;       seg[i].second =           lower_bound(val.begin(), val.end(), seg[i].second) - val.begin() + 1;       r[c[i]][seg[i].first].push_back(seg[i].second);     }     for (int i = (n << 1); i >= 0; i--) {       for (int j = 0; j <= 1; j++) dp[j][i] = st[j ^ 1].getmax(i, n << 1);       for (int j = 0; j <= 1; j++)         for (int x : r[j][i]) {           if (!upd[j][x]) {             st[j].update(x, x, dp[j][x]);             upd[j][x] = true;           }           st[j].update(x, n << 1, 1);         }     }     cout << max(dp[0][0], dp[1][0]);     return 0;   }   