#include <bits/stdc++.h>
using namespace std;
int N;
long long L;
long long T;
long long S[6001], H[6001], P[6002];
long long M[1'000'001];
long long A[10'000'001], B[10'000'001];
int Q;
long long ceil(long long p, long long q)
{
return (p - 1) / q + 1;
}
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin >> N >> L >> T;
for (int i = 1; i <= N; i++)
cin >> S[i] >> H[i] >> P[i];
vector<int> ord(N + 2);
iota(ord.begin(), ord.end(), 0);
sort(ord.begin() + 1, ord.end() - 1, [&](int i, int j)
{ return P[i] > P[j]; });
vector<pair<long long, long long>> monsters = {make_pair(T, 0LL)};
for (int i = 1; i <= N; i++)
{
vector<array<long long, 3>> segments;
pair<long long, long long> next_monster = make_pair(S[ord[i]], H[ord[i]]);
monsters.insert(lower_bound(monsters.begin(), monsters.end(), next_monster), next_monster);
assert(is_sorted(monsters.begin(), monsters.end()));
for (int j = 0; j < i; j++)
{
long long cur = monsters[j].first;
long long next = monsters[j + 1].first;
long long weights = monsters[j].second;
long long connect_diff = ceil(next - cur, weights);
while (!segments.empty() && connect_diff >= segments.back()[0])
{
cur = segments.back()[1];
weights += segments.back()[2];
segments.pop_back();
connect_diff = ceil(next - cur, weights);
}
segments.emplace_back(array{connect_diff, cur, weights});
}
reverse(segments.begin(), segments.end());
long long last = T;
for (auto [diff, cur, weights] : segments)
{
// cerr << i << ": " << diff << " starting from " << cur << " with sum " << acc_weights << '\n';
if (diff <= L)
{
long long a = weights * (P[ord[i]] - P[ord[i + 1]]);
long long b = (diff * weights - (last - cur)) * (P[ord[i]] - P[ord[i + 1]]) - diff * a;
last = cur;
A[diff] += a;
B[diff] += b;
}
}
}
for (int l = 1; l <= L; l++)
A[l] += A[l - 1];
for (int l = 1; l <= L; l++)
B[l] += B[l - 1];
cin >> Q;
for (int i = 1; i <= Q; i++)
{
cin >> M[i];
int l = 0, r = L;
while (l < r)
{
int mid = (l + r + 1) / 2;
if (M[i] < A[mid] * mid + B[mid])
r = mid - 1;
else
l = mid;
}
cout << l << '\n';
}
}