#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
#define ff first
#define ss second
#define pi pair<ll, ll>
#define pll pair<long long, long long>
#define vi vector<ll>
#define vll vector<long long>
#define vpi vector<pair<ll,ll>>
#define vpll vector<pair<long long, long long>>
#define pb push_back
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define sz(x) (ll)(x).size()
#define forall(it,x) for(auto& it:(x))
#define mp make_pair
pi operator+(pi a, pi b) { return mp(a.ff+b.ff, a.ss+b.ss); }
pi operator-(pi a, pi b) { return mp(a.ff-b.ff, a.ss-b.ss); }
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
ll cross(pi a, pi b) {
return (max(a.ss - b.ss, 0LL) + b.ff - a.ff - 1) / (b.ff-a.ff);
}
struct Player {
ll s,h,p;
};
signed main() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
ll n, l, t;
cin >> n >> l >> t;
vector<Player> pl(n);
vector<ll> p(n);
for(ll i=0; i<n; ++i) {
cin >> pl[i].s >> pl[i].h >> pl[i].p;
p[i] = pl[i].p;
}
p.push_back(0);
sort(all(p));
p.erase(unique(all(p)), p.end());
sort(all(pl), [&](Player a, Player b) {
return a.s > b.s;
});
vpi prefix(l+2);
for(ll i=1; i<sz(p); ++i) {
ll H = 0;
vector<pair<ll, ll>> f;
for(auto[s,h,P] : pl) {
if(P < p[i]) continue;
H += h;
f.push_back({H, s-t});
}
vector<pll> hull = {mp(0,0)};
for(auto par : f) {
while(sz(hull) > 1 && cross(hull.back(), par) <= cross(hull[sz(hull)-2], hull.back())) hull.pop_back();
hull.pb(par);
}
ll diff = (p[i] - p[i-1]);
for(ll j=0; j<sz(hull); ++j) {
ll L=0, R=l+1;
if(j > 0) L = max(0LL, cross(hull[j-1], hull[j]));
if(j+1 < sz(hull)) R = min(l+1, cross(hull[j], hull[j+1]));
if(L < R) {
prefix[L] = prefix[L] + mp(hull[j].ff * diff, hull[j].ss * diff);
prefix[R] = prefix[R] - mp(hull[j].ff * diff, hull[j].ss * diff);
}
}
}
for(ll i=1; i<=l; ++i) prefix[i] = prefix[i] + prefix[i-1];
ll q; cin >> q;
while(q--) {
ll x; cin >> x;
ll lo=0, hi=l;
while(lo < hi) {
ll mid =(lo+hi+1)/2;
if(prefix[mid].ff * mid + prefix[mid].ss <= x) lo = mid;
else hi = mid-1;
}
cout << lo << "\n";
}
return 0;
}