#include <bits/stdc++.h>   using namespace std;   template <typename T>   inline bool chkmin(T &x, T y) {     return x > y ? x = y, 1 : 0;   }   template <typename T>   inline bool chkmax(T &x, T y) {     return x < y ? x = y, 1 : 0;   }   template <typename T>   inline void read(T &x) {     char ch = getchar();     int f = 1;     x = 0;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) x = x * 10 + ch -  0 , ch = getchar();     x *= f;   }   template <typename T, typename... Args>   inline void read(T &x, Args &...args) {     char ch = getchar();     int f = 1;     x = 0;     while (ch <  0  || ch >  9 ) {       if (ch ==  - ) f = -1;       ch = getchar();     }     while (ch >=  0  && ch <=  9 ) x = x * 10 + ch -  0 , ch = getchar();     x *= f;     read(args...);   }   int n, m, C, emp, dlt, len[300050], crs[300050], ans[300050];   set<int> se;   map<int, int> both[300050];   struct Time {     int t, x;     bool operator<(const Time &rhs) const { return t < rhs.t; }   } a[300050 << 2];   struct cloud {     int l, r, c;     bool operator<(const cloud &rhs) const { return c < rhs.c; }   } c[300050];   struct Query {     int x, id;     bool operator<(const Query &rhs) const { return x < rhs.x; }   } q[300050];   int maxv[300050 << 2];   void modify(int u, int l, int r, int x) {     if (l == r) return (void)(maxv[u] = len[x]);     if (x <= ((l + r) >> 1))       modify(u << 1, l, ((l + r) >> 1), x);     else       modify(u << 1 | 1, ((l + r) >> 1) + 1, r, x);     maxv[u] = max(maxv[u << 1], maxv[u << 1 | 1]);   }   int query(int u, int l, int r, int tl, int tr) {     if (tl > tr) return 0;     if (tl <= l && r <= tr) return maxv[u];     int ret = 0;     if (tl <= ((l + r) >> 1)) ret = query(u << 1, l, ((l + r) >> 1), tl, tr);     if (((l + r) >> 1) < tr)       chkmax(ret, query(u << 1 | 1, ((l + r) >> 1) + 1, r, tl, tr));     return ret;   }   int main() {     read(n, C);     for (register int i = 1; i <= n; ++i) read(c[i].l, c[i].r, c[i].c);     sort(c + 1, c + n + 1);     int tot = 0;     for (register int i = 1; i <= n; ++i)       a[++tot] = Time{c[i].l, i}, a[++tot] = Time{c[i].r, -i};     a[++tot] = Time{int(2e9), 0};     sort(a + 1, a + tot + 1);     read(m);     for (register int i = 1; i <= m; ++i) read(q[i].x), q[i].id = i;     sort(q + 1, q + m + 1);     int pos = 1;     for (register int i = 1; i <= tot; ++i) {       int T = a[i].t - a[i - 1].t;       if (se.empty())         emp += T;       else if (se.size() == 1) {         int x = *se.begin(), cur = -1e9;         len[x] += T, crs[x] += T, modify(1, 1, n, x);         int rr = upper_bound(c + 1, c + n + 1, cloud{0, 0, C - c[x].c}) - c - 1;         if (rr >= x)           chkmax(cur, query(1, 1, n, 1, x - 1)),               chkmax(cur, query(1, 1, n, x + 1, rr));         else           chkmax(cur, query(1, 1, n, 1, rr));         chkmax(crs[x], len[x] + cur);         if (c[x].c <= C) chkmax(dlt, crs[x]);       } else if (se.size() == 2) {         int x = *se.begin(), y = *se.rbegin();         if (c[x].c + c[y].c <= C) {           both[x][y] += T;           chkmax(crs[x], both[x][y] + len[x] + len[y]),               chkmax(crs[y], both[x][y] + len[x] + len[y]);           chkmax(dlt, max(crs[x], crs[y]));         }       }       while (pos <= m && dlt + emp >= q[pos].x)         ans[q[pos].id] = a[i].t - (dlt + emp - q[pos].x), pos++;       if (a[i].x > 0)         se.insert(a[i].x);       else         se.erase(-a[i].x);     }     for (register int i = 1; i <= m; ++i) printf( %d n , ans[i]);     return 0;   }