#include <bits/stdc++.h>
using namespace std;
inline int gi() {
  register int data = 0, w = 1;
  register char ch = 0;
  while (!isdigit(ch) && ch != '-') ch = getchar();
  if (ch == '-') w = -1, ch = getchar();
  while (isdigit(ch)) data = 10 * data + ch - '0', ch = getchar();
  return w * data;
}
void chkmax(int &x, int y) {
  if (x < y) x = y;
}
const int MAX_N = 3e5 + 5;
struct Cloud {
  int l, r, c;
} cld[MAX_N];
bool operator<(const Cloud &l, const Cloud &r) { return l.c < r.c; }
struct Query {
  int id, t;
} q[MAX_N];
bool operator<(const Query &l, const Query &r) { return l.t < r.t; }
struct Node {
  int t, op, id;
} a[MAX_N << 1];
int tot = 0;
bool operator<(const Node &l, const Node &r) { return l.t < r.t; }
int N, M, C, single[MAX_N], opt[MAX_N], ans[MAX_N];
map<int, int> cross[MAX_N];
set<int> s;
set<int>::iterator ite;
int Free, Top;
int mx[MAX_N << 2];
void modify(int o, int l, int r, int pos, int v) {
  if (l == r) return (void)(mx[o] = v);
  int mid = (l + r) >> 1;
  if (pos <= mid)
    modify((o << 1), l, mid, pos, v);
  else
    modify((o << 1 | 1), mid + 1, r, pos, v);
  mx[o] = max(mx[(o << 1)], mx[(o << 1 | 1)]);
}
int find(int o, int l, int r) {
  if (l == r) return l;
  int mid = (l + r) >> 1;
  if (mx[(o << 1)] > mx[(o << 1 | 1)])
    return find((o << 1), l, mid);
  else
    return find((o << 1 | 1), mid + 1, r);
}
int query(int o, int l, int r, int ql, int qr) {
  if (ql <= l && r <= qr) return find(o, l, r);
  int mid = (l + r) >> 1, res = 0;
  if (ql <= mid) res = query((o << 1), l, mid, ql, qr);
  if (qr > mid) {
    int tmp = query((o << 1 | 1), mid + 1, r, ql, qr);
    if (single[tmp] > single[res]) res = tmp;
  }
  return res;
}
int sum(int x, int y) {
  if (x > y) swap(x, y);
  return single[x] + single[y] + cross[x][y];
}
void solve() {
  int now = 0, pos = 1;
  for (int i = 1; i <= tot; i++) {
    int dlt = a[i].t - now;
    now = a[i].t;
    if (!s.size())
      Free += dlt;
    else if (s.size() == 1) {
      ite = s.upper_bound(0);
      int x = *ite;
      single[x] += dlt;
      modify(1, 1, N, x, single[x]);
      opt[x] += dlt;
      int rem = C - cld[x].c;
      if (rem >= 0) {
        int val = single[x];
        if (rem >= cld[1].c) {
          int l = 1, r = N, res = 1;
          while (l <= r) {
            int mid = (l + r) >> 1;
            if (cld[mid].c <= rem)
              res = mid, l = mid + 1;
            else
              r = mid - 1;
          }
          int ql = 1, qr = res;
          if (x == qr) --qr;
          if (x < qr) {
            ql = x + 1;
            if (ql <= qr) chkmax(val, sum(x, query(1, 1, N, ql, qr)));
            ql = 1, qr = x - 1;
          }
          if (ql <= qr) chkmax(val, sum(x, query(1, 1, N, ql, qr)));
        }
        chkmax(opt[x], val);
        chkmax(Top, opt[x]);
      }
    } else if (s.size() == 2) {
      ite = s.upper_bound(0);
      int x = *ite;
      ++ite;
      int y = *ite;
      if (cross[x].count(y) > 0)
        cross[x][y] += dlt;
      else
        cross[x][y] = dlt;
      if (cld[x].c + cld[y].c <= C) {
        chkmax(opt[x], sum(x, y));
        chkmax(opt[y], sum(x, y));
        chkmax(Top, opt[x]);
      }
    }
    while (pos <= M && Top + Free >= q[pos].t)
      ans[q[pos].id] = now - (Top + Free - q[pos].t), ++pos;
    if (pos > M) break;
    if (a[i].op == 1)
      s.insert(a[i].id);
    else
      s.erase(a[i].id);
  }
}
int main() {
  N = gi(), C = gi();
  for (int i = 1; i <= N; i++)
    cld[i].l = gi(), cld[i].r = gi(), cld[i].c = gi();
  sort(&cld[1], &cld[N + 1]);
  for (int i = 1; i <= N; i++) {
    a[++tot] = (Node){cld[i].l, 1, i};
    a[++tot] = (Node){cld[i].r, -1, i};
  }
  sort(&a[1], &a[tot + 1]);
  a[++tot] = (Node){(int)(2e9 + 7), 1, N + 1};
  M = gi();
  for (int i = 1; i <= M; i++) q[i].id = i, q[i].t = gi();
  sort(&q[1], &q[M + 1]);
  solve();
  for (int i = 1; i <= M; i++) printf("%d\n", ans[i]);
  return 0;
}
