#include <bits/stdc++.h>
using namespace std;
struct seg {
	int n;
	vector<long long> val;
	seg(int _n): n(_n), val(2*_n,1e18) {}
	void up(int x, long long u) {
		for(x+=n;x;x>>=1)
			val[x] = min(val[x], u);
	}
	long long qry(int l, int r) {
		long long ans = 1e18;
		for(l+=n,r+=n;l<r;l>>=1,r>>=1) {
			if(l&1)
				ans=min(ans,val[l++]);
			if(r&1)
				ans=min(ans,val[--r]);
		}
		return ans;
	}
};
int main() {
	long long x, t, w;
	int n, m;
	cin >> x >> n >> m >> w >> t;
	seg tree(n+1);
	long long s[n+1];
	for(int i=0;i<n;i++)
		cin >> s[i];
	s[n++] = x;
	long long u[n];
	memcpy(u,s,sizeof(u));
	for(int i=0;i<n;i++)
		u[i] %= t;
	sort(u,u+n);
	for(int i=0;i<n;i++) {
		int id = lower_bound(u,u+n+1,s[i]%t)-u;
		tree.up(id,s[i]);
	}
	pair<long long, long long> ppl[m];
	for(int i=0;i<m;i++)
		cin >> ppl[i].first >> ppl[i].second;
	long long d[m], c[m];
	sort(s,s+n);
	sort(ppl,ppl+m);
	for(int i=0;i<m;i++)
		d[i] = ppl[i].first, c[i] = ppl[i].second;
	long long dp[m+1];
	memset(dp,1,sizeof(dp));
	dp[m] = 0;
	for(int i=m;i;i--) {
		long long cur = 0;
		dp[i-1] = min(dp[i-1], dp[i]);
		for(int j=i;j--;) {
			long long minT = tree.qry(lower_bound(u,u+n,d[j])-u,i==m?n:lower_bound(u,u+n,d[i])-u);
			minT -= (minT % t);
			minT += d[j];
			if(minT < 1e17)
				cur += c[j] - (x - minT) / t * w - w;
			else
				cur = 1e18;
			dp[j] = min(dp[j], dp[i] + cur);
		}
	}
	long long ans = dp[0];
	ans += w * (x / t + 1);
	for(int i=0;i<m;i++)
		ans += w * ((x - d[i]) / t + 1);
	cout << ans;
}
| # | 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... |