#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define all(v) begin(v), end(v)
#define pi pair<int, int>
#define vi vector<int>
using namespace std;
const int MXN = 600000 + 10;
const ll INF = (ll)1e18;
struct Seg {
  vector<ll> t;
  Seg() { t.assign(MXN * 4, INF); }
  void upd(int node, int l, int r, int pos, ll v) {
    if (l == r) { t[node] = min(t[node], v); return; }
    int mid = (l + r) >> 1;
    if (pos <= mid) upd(node<<1, l, mid, pos, v);
    else upd(node<<1|1, mid+1, r, pos, v);
    t[node] = min(t[node<<1], t[node<<1|1]);
  }
  ll query(int node, int l, int r, int ql, int qr) {
    if (ql > qr) return INF;
    if (ql <= l && r <= qr) return t[node];
    int mid = (l + r) >> 1;
    if (qr <= mid) return query(node<<1, l, mid, ql, qr);
    if (ql > mid) return query(node<<1|1, mid+1, r, ql, qr);
    return min(query(node<<1, l, mid, ql, qr), query(node<<1|1, mid+1, r, ql, qr));
  }
};
struct Edge {
  int s, e, c;
  ll w;
};
Seg L, R;
Edge edges[MXN];
vector<int> xs;
ll ans = INF;
int main() {
  ios_base::sync_with_stdio(0); cin.tie(0);
  int m, start;
  cin >> m >> start;
  
  xs.push_back(start);
  xs.push_back(1);
  
  for (int i = 1; i <= m; ++i) {
    int s, e, cen;
    ll cost;
    cin >> s >> e >> cen >> cost;
    edges[i].s = s;
    edges[i].e = e;
    edges[i].c = cen;
    edges[i].w = cost;
    xs.push_back(s);
    xs.push_back(cen);
    xs.push_back(e);
  }
  
  sort(xs.begin(), xs.end());
  xs.erase(unique(xs.begin(), xs.end()), xs.end());
  
  for (int i = 1; i <= m; ++i) {
    edges[i].s = int(lower_bound(xs.begin(), xs.end(), edges[i].s) - xs.begin());
    edges[i].e = int(lower_bound(xs.begin(), xs.end(), edges[i].e) - xs.begin());
    edges[i].c = int(lower_bound(xs.begin(), xs.end(), edges[i].c) - xs.begin());
  }
  int maxIdx = (int)xs.size() - 1;
  L.upd(1, 0, maxIdx, 0, 0);
  R.upd(1, 0, maxIdx, maxIdx, 0);
  
  for (int i = 1; i <= m; ++i) {
    ll sum = 0;
    ll d1 = L.query(1, 0, maxIdx, edges[i].s, edges[i].e);
    sum += d1;
    L.upd(1, 0, maxIdx, edges[i].c, d1 + edges[i].w);
    
    ll d2 = R.query(1, 0, maxIdx, edges[i].s, edges[i].e);
    sum += d2;
    R.upd(1, 0, maxIdx, edges[i].c, d2 + edges[i].w);
    
    ans = min(ans, sum + edges[i].w);
  }
  
  if (ans >= INF) cout << -1;
  else cout << ans;
  return 0;
}
  
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |