#include #include #include #include #include #include using namespace std; struct{ double level; int cart; int status; int dest; double next_event; int cap, vel, stop; } E[100]; double vanish[100]; int n[100]; int N, M; int d; int flag_p; int main(void) { while(1){ scanf( "%d%d", &N, &M ); if( N == 0 && M == 0 ) break; flag_p = 0; // printf( "%d,%d\n", N, M ); scanf( "%d", &d ); for( int i = 0; i < N; i ++ ) scanf("%d", &n[i] ); for( int i = 0; i < M; i ++ ){ int k; scanf( "%d%d%d%d", &E[i].cap, &E[i].vel, &E[i].stop, &k ); E[i].level = k - 1; E[i].cart = 0; E[i].status = 1; } int k, tx,ty,tz; scanf( "%d%d%d%d", &k, &tx, &ty, &tz ); k --; for( int i = 0; i < N; i ++ ){ int d = i - k; if( d == 0 ) vanish[i] = tx; else if( d > 0 ) vanish[i] = tx + ty * abs(d); else if( d < 0 ) vanish[i] = tx + tz * abs(d); } double t = 0; double TimLast = 0; int CTotal = 0; CTotal = n[0]; n[0] = 0; while( 1 ){ int dest = -1; for( int i = 0; i < N; i ++ ) if( n[i] > 0 ) dest = i; if( dest < 0 ){ int d = 0; for( int i = 0; i < M; i ++ ) d += E[i].cart; if( d == 0 ) break; dest = 0; } for( int i = 0; i < M; i ++ ){ if( E[i].status == 0 ){ if( E[i].next_event <= t ){ if( E[i].cart > 0 && E[i].level < 0.5 ){ TimLast = t; CTotal += E[i].cart; E[i].cart = 0; } E[i].status = 1; } } if( E[i].status != 0 ){ int d2; if( E[i].cap > E[i].cart ) d2 = dest; else d2 = 0; E[i].dest = d2; E[i].next_event = t + d * fabs(E[i].level - d2) / E[i].vel; E[i].status = 1; } } double ne = -1; int neid = -1; for( int i = 0; i < M; i ++ ){ if( ne < 0 || E[i].next_event < ne ){ ne = E[i].next_event; neid = i; } } for( int i = 0; i < N; i ++ ){ if( vanish[i] >= 0 && (ne < 0 || vanish[i] < ne ) ){ ne = vanish[i]; neid = M + i; } } for( int i = 0; i < M; i ++ ){ if( E[i].status != 0 ){ if( E[i].dest > E[i].level ) E[i].level += E[i].vel * (ne - t) / d; else E[i].level -= E[i].vel * (ne - t) / d; } } char mes[1024]; if( neid >= M ){ vanish[neid-M] = -1; n[neid-M] = 0; sprintf( mes, "Vanish: %d", neid - M + 1 ); } else{ if( E[neid].status == 0 ){ // Departure sprintf( mes, "Depart: #%d from level %lf", neid, E[neid].level ); } else{ // Apparture sprintf( mes, "Apart: #%d to level %d(%lf) %dcart(%d/%d)", neid, E[neid].dest, E[neid].level, k, E[neid].cart, E[neid].cap ); // printf("%s\n",mes); int k; if( n[E[neid].dest] >= E[neid].cap - E[neid].cart ){ k = E[neid].cap - E[neid].cart; } else{ k = n[E[neid].dest]; } E[neid].cart += k; n[E[neid].dest] -= k; if( E[neid].dest > 0 ) flag_p = 1; E[neid].status = 0; E[neid].next_event = ne + E[neid].stop; sprintf( mes, "Apart: #%d to level %d(%lf) %dcart(%d/%d)", neid, E[neid].dest, E[neid].level, k, E[neid].cart, E[neid].cap ); } } t = ne; // printf( "%lf sec: %s\n", t, mes ); } if( !flag_p ) TimLast = 0; printf( "%d %.8lf\n", CTotal, TimLast ); } return 0; }