#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;
}
