#include <bits/stdc++.h>
using namespace std;
const int N = 300005;
struct Cloud {
  int l, r, c;
} c[N];
inline bool operator<(const Cloud &a, const Cloud &b) { return a.c < b.c; }
struct Node {
  int t, op, id;
} a[N << 1];
struct Query {
  int k, id;
} q[N];
int n, m, cc, cnt, ans[N], len[N], tt[N];
struct TNode {
  int l, r, v;
} t[N << 2];
inline int lc(int pos) { return pos << 1; }
inline int rc(int pos) { return pos << 1 | 1; }
void build(int pos, int l, int r) {
  t[pos].l = l;
  t[pos].r = r;
  if (l == r) return;
  int mid = (l + r) >> 1;
  build(lc(pos), l, mid);
  build(rc(pos), mid + 1, r);
}
void modify(int pos, int p, int v) {
  if (t[pos].l == t[pos].r) {
    t[pos].v = v;
    return;
  }
  int mid = (t[pos].l + t[pos].r) >> 1;
  if (p <= mid)
    modify(lc(pos), p, v);
  else
    modify(rc(pos), p, v);
  t[pos].v = max(t[lc(pos)].v, t[rc(pos)].v);
}
int qmax(int pos) {
  if (t[pos].l == t[pos].r) return t[pos].l;
  return t[lc(pos)].v > t[rc(pos)].v ? qmax(lc(pos)) : qmax(rc(pos));
}
int query(int pos, int l, int r) {
  if (t[pos].l == l && t[pos].r == r) return qmax(pos);
  int mid = (t[pos].l + t[pos].r) >> 1;
  if (r <= mid)
    return query(lc(pos), l, r);
  else if (l > mid)
    return query(rc(pos), l, r);
  else {
    int lt = query(lc(pos), l, mid), rt = query(rc(pos), mid + 1, r);
    return len[lt] >= len[rt] ? lt : rt;
  }
}
set<int> st;
map<int, int> mp[N];
inline int calc(int x, int y) {
  if (x > y) swap(x, y);
  return len[x] + len[y] + mp[x][y];
}
int main() {
  ios::sync_with_stdio(false);
  cin >> n >> cc;
  for (int i = 1; i <= n; i++) cin >> c[i].l >> c[i].r >> c[i].c;
  sort(c + 1, c + n + 1);
  c[n + 1] = {0, 0, INT_MAX};
  for (int i = 1; i <= n; i++)
    a[++cnt] = {c[i].l, 1, i}, a[++cnt] = {c[i].r, -1, i};
  sort(a + 1, a + cnt + 1, [](Node a, Node b) { return a.t < b.t; });
  a[++cnt] = {INT_MAX, 1, n + 1};
  cin >> m;
  for (int i = 1; i <= m; i++) cin >> q[i].k, q[i].id = i;
  sort(q + 1, q + m + 1, [](Query a, Query b) { return a.k < b.k; });
  int sum = 0, del = 0;
  if (n) build(1, 1, n);
  for (int i = 1, idx = 0, pos = 1; i <= cnt; i++) {
    int l = a[i].t - idx;
    idx = a[i].t;
    if (st.empty())
      sum += l;
    else if (st.size() == 1) {
      int x = *st.begin();
      len[x] += l;
      tt[x] += l;
      modify(1, x, len[x]);
      if (c[x].c <= cc) {
        int l = 1,
            r = upper_bound(c + 1, c + n + 1, Cloud{0, 0, cc - c[x].c}) - c - 1;
        int val = len[x];
        if (l <= x && x <= r) {
          if (l < x) val = max(val, calc(x, query(1, l, x - 1)));
          if (x < r) val = max(val, calc(x, query(1, x + 1, r)));
        } else if (l <= r)
          val = max(val, calc(x, query(1, l, r)));
        tt[x] = max(tt[x], val);
        del = max(del, tt[x]);
      }
    } else if (st.size() == 2) {
      int x = *st.begin(), y = *st.rbegin();
      mp[x][y] += l;
      if (c[x].c + c[y].c <= cc) {
        tt[x] = max(tt[x], calc(x, y));
        tt[y] = max(tt[y], calc(x, y));
        del = max(del, max(tt[x], tt[y]));
      }
    }
    while (pos <= m && del + sum >= q[pos].k)
      ans[q[pos].id] = idx - (del + sum - q[pos].k), ++pos;
    if (a[i].op == 1)
      st.insert(a[i].id);
    else
      st.erase(a[i].id);
  }
  for (int i = 1; i <= m; i++) cout << ans[i] << endl;
  return 0;
}
