#include <stdio.h>
#include <string.h>
#include <math.h>
#include <ctype.h>
#include <stdlib.h>
#include <time.h>
#include <assert.h>
#include <limits.h>
#define MAXTIME 900000
#define MAXDESK 30
typedef struct
{
int id[MAXDESK];
int time[MAXDESK];
int toDo;
int End;
}ItemInfo;
int desk[MAXDESK][MAXTIME];
int findTime(int deskID, int timeWidth,int start)
{
for (int i = start; i+timeWidth < MAXTIME; i++)
{
if(desk[deskID][i]==0){
int flag=1;
for (int j = i; j < i+timeWidth; j++)
{
if(desk[deskID][j]!=0){
i+=timeWidth;flag=0;break;
}
}
if(flag){
return i;
}
}
}
return -1;
}
int main ()
{
int m;//机器数量
int n;//工件数量
scanf("%d%d",&m,&n);
int flow[400]={0};//顺序流水线
for (int i = 0; i < m*n; i++)
scanf("%d",&flow[i]);
ItemInfo list[MAXDESK]={{0}};
for (int i = 1; i <= n; i++)
for (int j = 0; j < m; j++)
scanf("%d",&list[i].id[j]);
for (int i = 1; i <= n; i++)
for (int j = 0; j < m; j++)
scanf("%d",&list[i].time[j]);
//输入完成
for (int i = 0; flow[i] != 0; i++)//流水线顺序进行
{
int ID=flow[i];
int Step=list[ID].toDo++;
int NeedMachine=list[ID].id[Step];
int NeedTime=list[ID].time[Step];
int Last=list[ID].End;
int start=findTime(NeedMachine,NeedTime,Last);
for (int i = 0; i < NeedTime; i++)
{
desk[NeedMachine][start+i]=ID;
}
list[ID].End=start+NeedTime;
}
for (int i = 0; i < MAXTIME; i++)
{
int empty=1;
for (int j = 1; j <= m; j++)
{
if(desk[j][i]!=0){
empty=0;break;
}
}
if(empty){
printf("%d",i);break;
}
}
return 0;
}
#7 #9 WA