func_code_string: #include <bits/stdc++.h>   using namespace std;   template <typename T>   inline T qmin(const T a, const T b) {     return a < b ? a : b;   }   template <typename T>   inline T qmax(const T a, const T b) {     return a > b ? a : b;   }   template <typename T>   inline void getmin(T &a, const T b) {     if (a > b) a = b;   }   template <typename T>   inline void getmax(T &a, const T b) {     if (a < b) a = b;   }   inline void fileio(string s) {     freopen((s +  .in ).c_str(),  r , stdin);     freopen((s +  .out ).c_str(),  w , stdout);   }   const int inf = 1e9;   const long long linf = 1e17 + 7;   const int N = 2e5 + 7;   struct seg {     int h, l, r;     seg() {}     seg(int _h, int _l, int _r) : h(_h), l(_l), r(_r) {}     bool operator<(const seg &b) const { return h < b.h; }   } a[N];   struct node {     int l, r, v;     seg s;     node() {}     node(int _l, int _r, int _v, seg _s) : l(_l), r(_r), v(_v), s(_s) {}     bool operator<(const node &b) const { return l < b.l; }   };   inline int overlap(int l1, int r1, int l2, int r2) {     return qmax(0, qmin(r1, r2) - qmax(l1, l2));   }   inline bool canget(const seg &a, set<node>::iterator it) {     set<node>::iterator ul = it, ur = it;     --ul;     ++ur;     seg pre = ul->s, nxt = ur->s, cur = it->s;     if (pre.h < a.h && pre.h > cur.h && overlap(a.l, a.r, pre.l, pre.r) &&         overlap(pre.l, pre.r, cur.l, cur.r))       return false;     if (nxt.h < a.h && nxt.h > cur.h && overlap(a.l, a.r, nxt.l, nxt.r) &&         overlap(nxt.l, nxt.r, cur.l, cur.r))       return false;     return true;   }   set<node> s;   int n, t;   int main() {     scanf( %d%d , &n, &t);     for (int i = 1; i <= n; ++i) scanf( %d%d%d , &a[i].h, &a[i].l, &a[i].r);     a[++n] = seg(t, -inf, inf);     sort(a + 1, a + n + 1);     node bot(-inf, inf, inf << 1, seg(0, -inf, inf));     node left(-inf - 1, -inf, 0, seg());     node right(inf, inf + 1, 0, seg());     s.insert(bot);     s.insert(left);     s.insert(right);     for (int i = 1; i <= n; ++i) {       set<node>::iterator ul = s.upper_bound(node(a[i].l, a[i].r, 0, seg())), ur;       int ans = 0;       for (--ul; ul->r <= a[i].l; ++ul)         ;       for (ur = ul; ur->l < a[i].r; ++ur) {         if (!canget(a[i], ur)) continue;         getmax(ans, qmin(overlap(a[i].l, a[i].r, ur->l, ur->r), ur->v));       }       --ur;       int l = ul->l, r = ur->r, v1 = ul->v, v2 = ur->v;       seg s1 = ul->s, s2 = ur->s;       ++ur;       s.erase(ul, ur);       s.insert(node(a[i].l, a[i].r, ans, a[i]));       if (l < a[i].l) s.insert(node(l, a[i].l, v1, s1));       if (r > a[i].r) s.insert(node(a[i].r, r, v2, s2));     }     set<node>::iterator ite = s.begin();     ++ite;     printf( %d n , ite->v);     return 0;   }   