#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #include<queue> #include<algorithm> #include<map> #include<iomanip> #define INF 99999999 using namespace std; const int MAX=2500+10; char mon[5]; int M[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; struct Node{ int num,t; }order[MAX],q[MAX*4]; int MON(char *m){ if(strcmp(m,"Jan") == 0)return 1; if(strcmp(m,"Feb") == 0)return 2; if(strcmp(m,"Mar") == 0)return 3; if(strcmp(m,"Apr") == 0)return 4; if(strcmp(m,"May") == 0)return 5; if(strcmp(m,"Jun") == 0)return 6; if(strcmp(m,"Jul") == 0)return 7; if(strcmp(m,"Aug") == 0)return 8; if(strcmp(m,"Sep") == 0)return 9; if(strcmp(m,"Oct") == 0)return 10; if(strcmp(m,"Nov") == 0)return 11; return 12; } bool LeapYear(int &year){ return year%4 == 0 && year%100 || year%400 == 0; } int Time(int &year,int Mon,int &d,int &h){ int t=0; for(int i=2000;i<year;++i){ if(LeapYear(i))t+=366; else t+=365; } bool flag=LeapYear(year); for(int i=1;i<Mon;++i){ if(flag && i == 2)t+=29; else t+=M[i]; } t+=d-1; return t*24+h; } int main(){ int n,m,t,s,r,h,d,year,a; while(~scanf("%d%d",&n,&m),n+m){ for(int i=0;i<n;++i){ scanf("%s%d%d%d%d",mon,&d,&year,&h,&r); order[i].num=r,order[i].t=Time(year,MON(mon),d,h); } int top=0,tail=0,p=0; __int64 sum=0; scanf("%d%d",&t,&s); for(int i=0;i<m;++i){ scanf("%d",&a); while(top<tail && q[tail-1].num+(i-q[tail-1].t)*s>=a)--tail; q[tail].num=a,q[tail++].t=i; while(p<n && i == order[p].t){ while(q[top].t+t<i)++top; sum+=(q[top].num+(i-q[top].t)*s)*order[p++].num; } } printf("%I64d\n",sum); } return 0; }