#include <bits/stdc++.h>
using namespace std;
int n, tot, C, x[600100], m, y[600100], dp[600100], f[600100], tt[600100];
vector<int> v[600100], add[600100], del[600100];
bool imp[600100];
struct dat {
  int l, r, c;
  dat(int l = 0, int r = 0, int c = 0) : l(l), r(r), c(c) {}
  void in() { scanf("%d %d %d", &l, &r, &c); }
} d[600100];
inline void chkmax(int &x, int y) {
  if (x < y) x = y;
}
void modify(int p, int val) {
  for (; p <= m; p += p & -p) chkmax(tt[p], val);
}
int query(int p) {
  int rlt = 0;
  for (; p; p -= p & -p) chkmax(rlt, tt[p]);
  return rlt;
}
vector<int> adj[600100];
map<int, int> mp[600100];
int main() {
  scanf("%d %d", &n, &C);
  for (int i = 1; i <= n; i++)
    d[i].in(), x[++tot] = d[i].l, x[++tot] = d[i].r, y[++m] = d[i].c;
  sort(x + 1, x + tot + 1), tot = unique(x + 1, x + tot + 1) - x - 1;
  for (int i = 1; i <= n; i++) {
    add[lower_bound(x + 1, x + tot + 1, d[i].l) - x].push_back(i);
    del[lower_bound(x + 1, x + tot + 1, d[i].r) - x].push_back(i);
  }
  sort(y + 1, y + m + 1), m = unique(y + 1, y + m + 1) - y - 1;
  set<int> S;
  for (int i = 1; i < tot; i++) {
    for (auto x : add[i]) S.insert(x);
    for (auto x : del[i]) S.erase(x);
    int sz = S.size();
    if (sz > 2)
      imp[i] = 1;
    else {
      for (auto y : S) v[i].push_back(y);
    }
  }
  dp[1] = x[1];
  for (int i = 1, free = x[1]; i < tot; i++) {
    for (auto p : del[i])
      modify(lower_bound(y + 1, y + m + 1, d[p].c) - y, f[p]);
    dp[i + 1] = dp[i];
    if (!imp[i]) {
      int sz = v[i].size(), L = x[i + 1] - x[i];
      if (!sz)
        dp[i + 1] = dp[i] + L, free += L;
      else {
        if (sz == 2) {
          int p = v[i][0], q = v[i][1];
          adj[p].push_back(q);
          adj[q].push_back(p);
          mp[p][q] = mp[q][p] = mp[p][q] + L;
          if (d[p].c + d[q].c <= C)
            chkmax(dp[i + 1], free + f[p] + f[q] + mp[p][q]);
        } else {
          int k = v[i][0];
          f[k] += L;
          ;
          if (d[k].c <= C)
            chkmax(
                dp[i + 1],
                free + f[k] +
                    query(upper_bound(y + 1, y + m + 1, C - d[k].c) - y - 1));
          for (auto p : adj[k])
            if (d[k].c + d[p].c <= C)
              chkmax(dp[i + 1], free + f[k] + f[p] + mp[k][p]);
        }
      }
    }
  }
  scanf("%d", &m);
  for (int i = 0, p; i < m; i++) {
    scanf("%d", &p);
    int k = lower_bound(dp + 1, dp + tot + 1, p) - dp;
    printf("%d\n", k <= tot ? x[k] - (dp[k] - p) : x[tot] + (p - dp[tot]));
  }
  return 0;
}
