func_code_string: #include <bits/stdc++.h>   #pragma comment(linker,  /STACK:640000000 )   using namespace std;   const double eps = 1e-9;   const double pi = acos(-1.0);   template <class T>   T sqr(T x) {     return x * x;   }   const int maxn = (int)(1e5) + 10;   const int inf = (int)(2e9);   struct Edge {     int to, w, num;     Edge() : to(0), w(0), num(0) {}     Edge(int to, int w, int num) : to(to), w(w), num(num) {}   };   int n, L;   int x[maxn], d[maxn], t[maxn], p[maxn];   vector<Edge> g[2 * maxn];   vector<int> pt;   int dist[2 * maxn], pred[2 * maxn], num[2 * maxn];   int main() {     scanf( %d%d , &n, &L);     set<int> spt;     spt.insert(0);     pt.push_back(0);     spt.insert(L);     pt.push_back(L);     for (int i = 0; i < n; i++) {       scanf( %d%d%d%d , &x[i], &d[i], &t[i], &p[i]);       if (d[i] <= t[i] || x[i] - p[i] < 0) continue;       if (spt.find(x[i] - p[i]) == spt.end()) {         pt.push_back(x[i] - p[i]);         spt.insert(x[i] - p[i]);       }       if (spt.find(x[i] + d[i]) == spt.end()) {         pt.push_back(x[i] + d[i]);         spt.insert(x[i] + d[i]);       }     }     sort(pt.begin(), pt.end());     int N = (int)((pt).size());     for (int i = 0; i < n; i++) {       if (d[i] <= t[i] || x[i] - p[i] < 0) continue;       int v = int(lower_bound(pt.begin(), pt.end(), x[i] - p[i]) - pt.begin());       int u = int(lower_bound(pt.begin(), pt.end(), x[i] + d[i]) - pt.begin());       g[v].push_back(Edge(u, p[i] + t[i], i + 1));     }     for (int i = 0; i < N - 1; i++) {       g[i].push_back(Edge(i + 1, pt[i + 1] - pt[i], 0));       g[i + 1].push_back(Edge(i, pt[i + 1] - pt[i], 0));     }     set<pair<int, int> > sd;     for (int i = 0; i < N; i++) {       dist[i] = inf;       pred[i] = -1;       num[i] = 0;     }     dist[0] = 0;     sd.insert(make_pair(0, 0));     while (!sd.empty()) {       int v = sd.begin()->second;       sd.erase(sd.begin());       for (int i = 0; i < g[v].size(); i++) {         if (dist[g[v][i].to] > dist[v] + g[v][i].w) {           sd.erase(make_pair(dist[g[v][i].to], g[v][i].to));           dist[g[v][i].to] = dist[v] + g[v][i].w;           pred[g[v][i].to] = v;           num[g[v][i].to] = g[v][i].num;           sd.insert(make_pair(dist[g[v][i].to], g[v][i].to));         }       }     }     cout << dist[N - 1] << endl;     vector<int> trp;     for (int v = N - 1; pred[v] != -1; v = pred[v]) {       if (num[v] != 0) trp.push_back(num[v]);     }     reverse(trp.begin(), trp.end());     cout << (int)((trp).size()) << endl;     for (int i = 0; i < (int)((trp).size()); i++) {       cout << trp[i] <<    ;     }     return 0;   }   