#include #include #include #include #include #include #include using namespace std; const double ERROR = 1e-4; enum { STATIC ,STOP , RUN , VANISH , ARRIVE }; char *str[] = { "STATIC" ,"STOP" , "RUN" , "VANISH" , "ARRIVE" }; struct data_t { int cap , vel , stop ; double pos ; int dev; double last_time ; int aim ; data_t(int p1=0,int p2=0 , int p3=0 , double p4=0) :cap(p1) , vel(p2) , stop(p3) , pos(p4){ last_time = 0.0; dev = 0; aim = 0; } bool isfull() const { return cap == dev; } }; struct event_t { int kind; int prm1,prm2,prm3; double time; event_t(double t , int k , int param1 = 0 , int param2 = 0 , int param3 = 0) { time = t ; kind = k ; prm1 = param1 ; prm2 = param2; prm3 = param3; } }; bool operator < (const event_t &p1,const event_t &p2) { return p1.time > p2.time + ERROR; } template ostream& operator << (ostream& out , const vector& v) { for(int i = 0 ; i < (int)v.size() ; i++) out << (i?" ":"") << v[i]; return out; } int main() { int n , m; while(cin>>n>>m&&(n||m)) { int d ; cin >> d; vector device(n); for(int i=0;i> device[i]; vector dat(m); vector hist(m); for(int i = 0 ; i < m ; i++) { cin >> dat[i].cap >> dat[i].vel >> dat[i].stop >> dat[i].pos ; dat[i].pos -= 1.0; } int k , tx , ty , tz ; cin >> k >> tx >> ty >> tz; k--; priority_queue pq; for(int i = 1 ; i < n ; i++) { int diff = k - i; double vanish = 0; if(diff==0) vanish = tx; else if(diff>0) vanish = tx + fabs(diff) * tz; else if(diff<0) vanish = tx + fabs(diff) * ty; pq.push(event_t(vanish , VANISH , i)); } for(int i = 0 ; i < m ; i++) { pq.push(event_t(0.0 , STATIC , i)); } int total = device[0] ; device[0] = 0; double last_time = 0.0; while(!pq.empty()) { event_t ev = pq.top() ; pq.pop(); if(ev.kind == VANISH){ int p = ev.prm1; if(device[p]>0){ int aim = n-1; while(aim > 0 && device[aim]<=0) aim--; device[p] = 0; if(aim == p || aim == 0){ for(int i = 0 ; i < m ; i++) pq.push(event_t(ev.time , STATIC , i)); } } }else if(ev.kind == STATIC){ int ele = ev.prm1; double diff_time = ev.time - dat[ele].last_time; if(diff_time < -0.001) continue; int aim = n-1; if(dat[ele].isfull()) { aim = 0; } else{ while(aim > 0 && device[aim]<=0) aim--; if(dat[ele].pos == aim && aim == 0) continue; } hist[ele]++; dat[ele].pos += (dat[ele].aim>dat[ele].pos?1.0:-1.0) * dat[ele].vel * diff_time / (double)d; double cost = fabs(aim - dat[ele].pos) * d / (double)dat[ele].vel; pq.push(event_t(ev.time + cost , ARRIVE , ele , aim , hist[ele])); dat[ele].aim = aim; dat[ele].last_time = ev.time; }else if(ev.kind == ARRIVE){ int ele = ev.prm1; int dest = ev.prm2; int order = ev.prm3; if(order != hist[ele]) continue; pq.push(event_t(ev.time + dat[ele].stop , STATIC , ele)); if(dest == 0) { if(dat[ele].dev) { total += dat[ele].dev; dat[ele].dev = 0; last_time >?= ev.time + dat[ele].stop; } } else{ int take = min(dat[ele].cap - dat[ele].dev, device[dest]); dat[ele].dev += take; device[dest] -= take; if(device[dest]==0){ for(int i = 0 ; i < m ; i++) { if(i!=ele) pq.push(event_t(ev.time , STATIC , i)); } } } dat[ele].pos = dest; dat[ele].last_time = ev.time + dat[ele].stop; } /* cout << ev.time << " " << str[ev.kind] << " " << ev.prm1 << " " << ev.prm2 << " " << ev.prm3 << endl; cout << "!" ;for(int i = 0 ; i < m ; i++) cout << dat[i].pos << " " ; cout << endl; cout << device << endl; */ } printf("%d %.6f\n" , total , last_time); } return 0; }