#include <bits/stdc++.h>
#define endl "\n"
#define ll long long
using namespace std;
struct pass{
	ll d,c;
	bool operator<(const pass p)const{
		if(d == p.d)
			return c < p.c;
		return d < p.d;
	}
};
struct Line{
	ll m,p;
};
ll len = 1;
struct leechaotree{
	vector<Line> tree;
	leechaotree(ll l){
		while(len < l){
			len *= 2;
		}
		tree = vector<Line>(1<<19,{0,(ll)1e18});
	}
	
	ll calc(Line line,ll x){
		return 1LL*(-x+1)*line.m+line.p;
	}
	void insert(Line nw,ll l=0,ll r=len-1,ll v=1){
		ll mid = (r+l)/2;
		if(calc(nw,mid) < calc(tree[v],mid)){
			swap(tree[v],nw);
		}
		if(r-l==1)
			return;
		else if(calc(nw,l) < calc(tree[v],l)){
			insert(nw,l,mid,v*2);
		}
		else
			insert(nw,mid,r,v*2+1);
	}
	ll query(ll x,ll l=0,ll r=len-1,ll v=1){
		if(l>=r)
			return 1LL*(-x+1LL)*tree[v].m+1LL*tree[v].p;
		ll mid = (r+l)/2;
		if(x <= mid)
			return min(1LL*(-x+1LL)*tree[v].m+1LL*tree[v].p,query(x,l,mid,v*2));
		else
			return min(1LL*(-x+1LL)*tree[v].m+1LL*tree[v].p,query(x,mid,r,v*2+1));
	}
};
void solve(){
	ll X,N,M,W,T;
	cin >> X >> N >> M >> W >> T;
	
	vector<ll> S(N);
	for(int i=0;i<N;i++)
		cin >> S[i];
	S.push_back(X);
	vector<pass> passager(M);
	for(int i=0;i<M;i++){
		cin >> passager[i].d >> passager[i].c;
	}
	sort(passager.begin(),passager.end());
	sort(S.begin(),S.end(),[&](const ll& a,const ll& b){ return a%T < b%T;});
	vector<ll> pref(M+1,0);
	for(int i=1;i<=M;i++){
		pref[i] = pref[i-1]+passager[i-1].c;
	}
	vector<ll> last(N+1,0);
	for(int i=0;i<=N;i++){
		pass p = {S[i]%T,-1LL};
		auto it = upper_bound(passager.begin(),passager.end(),p);
		it--;
		ll l = it-passager.begin();
		last[i] = l;
	}
	
	vector<ll> dp(M+1,1e18);
	dp[M] = 0;
	leechaotree lct(M+1);
	for(ll i=M-1,j=N;i>=0;i--){
		ll D = passager[i].d,C = passager[i].c;
		while(j >= 0 && i <= last[j]){
			D = passager[last[j]].d;
			Line line = {1LL*((S[j]-D)/T) * W,1LL*last[j]*(1LL*(S[j]-D)/T)*W+dp[last[j]+1]
																		+pref[last[j]+1]};
			lct.insert(line);
			j--;
		}
		D = passager[i].d,C = passager[i].c;
		dp[i] = dp[i+1]+(1LL*(X-D)/T+1LL)*W;
		//cout << dp[i+1]+(1LL*(X-D)/T+1LL)*W << endl;
		dp[i] = min(dp[i],-pref[i]+lct.query(i));
		//cout << -pref[i]+lct.query(i) << endl;
		//cout << "dp[i] : " << dp[i] << endl;
		
		//cout << i << ' ' << j << endl;
		/*for(int j=0;j<=N;j++){
			if(S[j]%T > D){
				dp[i] = min(dp[last+1]+(pref[last+1]-pref[i])+(last-i+1)*((S[j]-D)/T)*W
							,dp[i]);
			}
		}*/
	}
	cout << dp[0] + (1LL*(X/T+1LL) * W) << endl;
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	int t = 1;
	//cin >> t;
 	while(t--){
		solve();
	}
	return 0;
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |