func_code_string: #include <bits/stdc++.h>   using namespace std;   const int MOD = 1e9 + 7;   const int SIZE = 1e6 + 10;   const int INF = 2147483647;   template <class T>   void maa(T& x, T y) {     if (x < y) x = y;   }   template <class T>   void mii(T& x, T y) {     if (x > y) x = y;   }   int a[SIZE];   int record[SIZE][3], rn;   void update_answer(int ll, int rr, int cul) {     record[rn][0] = ll;     record[rn][1] = rr;     record[rn][2] = cul;     rn++;   }   int C, l[SIZE], r[SIZE], c[SIZE], cn, cc_pos[SIZE];   pair<int, int> cc[SIZE];   vector<pair<int, int> > qq;   int single_add[SIZE];   int kerker[SIZE];   set<pair<int, int> > singles;   pair<int, int> BIT[SIZE][2];   void ins(int x, int v) {     pair<int, int> me = make_pair(v, x);     for (; x < SIZE; x += x & -x) {       if (me > BIT[x][0]) {         if (BIT[x][0].second != me.second) {           BIT[x][1] = BIT[x][0];         }         BIT[x][0] = me;       } else if (me > BIT[x][1]) {         BIT[x][1] = me;       }     }   }   int qq_BIT(int x, int id) {     int res = 0;     for (; x; x -= x & -x) {       if (BIT[x][0].second != id)         res = max(res, BIT[x][0].first);       else         res = max(res, BIT[x][1].first);     }     return res;   }   void update_single(int id, int v) {     single_add[id] += v;     ins(cc_pos[id], single_add[id]);   }   int get_single_ma(int id) {     int it = upper_bound(cc + 1, cc + cn, make_pair(C - c[id], INF)) - cc - 1;     if (it) {       return qq_BIT(it, cc_pos[id]);     }     return 0;   }   pair<int, int> GP(int x, int y) {     if (x > y) return make_pair(y, x);     return make_pair(x, y);   }   int an[SIZE];   int main() {     int n;     scanf( %d%d , &(n), &(C));     vector<pair<int, int> > rain;     cn = 1;     for (int i = (1); i < (n + 1); ++i) {       scanf( %d%d%d , &(l[i]), &(r[i]), &(c[i]));       rain.push_back(make_pair(l[i], i));       rain.push_back(make_pair(r[i], -i));       cc[cn++] = make_pair(c[i], i);     }     sort(cc + 1, cc + cn);     for (int i = (1); i < (cn); ++i) cc_pos[cc[i].second] = i;     sort((rain).begin(), (rain).end());     rain.push_back(make_pair(2000000000, 0));     int(m);     scanf( %d , &m);     for (int i = 0; i < (m); ++i) {       int(x);       scanf( %d , &x);       qq.push_back(make_pair(x, i));     }     sort((qq).begin(), (qq).end());     map<pair<int, int>, int> pair_add;     set<int> now;     int zero = 0;     int pair_ma = 0;     if (rain[0].first) {       update_answer(0, rain[0].first, 0);       zero += rain[0].first;     }     for (int i = 0, j; i < 2 * n; i = j) {       for (j = i; j < 2 * n && rain[j].first == rain[i].first; j++) {         int id = rain[j].second;         if (id < 0) {           now.erase(-id);         } else {           now.insert(id);         }       }       if (((int)(now).size()) == 0) {         update_answer(rain[i].first, rain[j].first,                       zero + max(pair_ma, get_single_ma(0)));         zero += rain[j].first - rain[i].first;       } else if (((int)(now).size()) == 1) {         int me = *now.begin();         if (c[me] <= C) {           int v = single_add[me] + max(get_single_ma(me), kerker[me]);           update_answer(rain[i].first, rain[j].first, zero + v);           update_single(me, rain[j].first - rain[i].first);           maa(pair_ma, v + rain[j].first - rain[i].first);         }       } else if (((int)(now).size()) == 2) {         int me = *now.begin();         int you = *now.rbegin();         if (c[me] + c[you] <= C) {           update_answer(               rain[i].first, rain[j].first,               zero + single_add[me] + single_add[you] + pair_add[GP(me, you)]);           pair_add[GP(me, you)] += rain[j].first - rain[i].first;           maa(pair_ma, single_add[me] + single_add[you] + pair_add[GP(me, you)]);           maa(kerker[me], pair_add[GP(me, you)] + single_add[you]);           maa(kerker[you], pair_add[GP(me, you)] + single_add[me]);         }       }     }     {       int it = 0;       for (int i = 0; i < (rn); ++i) {         while (it < m &&                record[i][1] - record[i][0] + record[i][2] >= qq[it].first) {           an[qq[it].second] = record[i][0] + (qq[it].first - record[i][2]);           it++;         }       }     }     for (int i = 0; i < (m); ++i) printf( %d n , an[i]);     return 0;   }   