// 32351ZN #include #include #include #include #include #include #include #include #include #include using namespace std; typedef vector ivec_t; typedef vector imat_t; #define FOR_EACH(p,q,r) for(p=q;p!=r;p++) #define FOR_EACH_C(p,c) for(p=(c).begin();p!=(c).end();p++) const int INF=1000000001; struct data_t { int now; int val; data_t(int n=0,int v=0):now(n),val(v){} }; bool operator<(data_t a,data_t b) { return a.val > b.val; } typedef pair edge_t; long long Solve(int* l,int* c,int n,int from,int to,ivec_t& dist) { if(from > to )swap(from,to); priority_queue pque; data_t data; vector optimal_val(n,INF); int i; data.now = from; data.val = 0; pque.push(data); optimal_val[data.now] = data.val; while(!pque.empty()) { data = pque.top(); pque.pop(); if(optimal_val[data.now] < data.val)continue; if(data.now == to)break; for(i = data.now+1 ; i < n ; i++) { int d = dist[i] - dist[data.now]; if(d <= l[0]) { int v= data.val + c[0]; if(optimal_val[i] > v) { pque.push(data_t(i,v)); optimal_val[i] = v; } } else if(d <= l[1]) { int v= data.val + c[1]; if(optimal_val[i] > v) { pque.push(data_t(i,v)); optimal_val[i] = v; } } else if(d <= l[2]) { int v= data.val + c[2]; if(optimal_val[i] > v) { pque.push(data_t(i,v)); optimal_val[i] = v; } } else break; } } return optimal_val[to]; } int main() { int l[3]; int c[3]; int i,n,from,to; FOR_EACH(i,0,3) { cin >> l[i]; } FOR_EACH(i,0,3) { cin >> c[i]; } cin >> n >> from >> to; from--; to--; ivec_t dist(n,0); FOR_EACH(i,1,n) { cin >> dist[i]; } cout << Solve(l,c,n,from,to,dist) << endl; return 0; }