1 #include<queue>
2 #include<cstdio>
3 #include<vector>
4 #include<cstring>
5 #include<iostream>
6 #include<algorithm>
7 #define RG register
8 using namespace std;
9 int n,m,top,ans;
10 int Time[23][23],mach[23][23],tot[23];
11 int que[500],Rank[500],Lasttime[23];
12 bool work[23][500];
13 bool check(int Begin,int T,int id)
14 {
15 for(int i=Begin;i<Begin+T;i++)
16 if(work[id][i])
17 return 0;
18 return 1;
19 }
20 int main()
21 {
22 scanf("%d%d",&m,&n);
23 top=n*m;
24 for(int i=1;i<=top;i++)
25 {
26 scanf("%d",&que[i]);
27 tot[que[i]]++;
28 Rank[i]=tot[que[i]];
29 }
30 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&mach[i][j]);
31 for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&Time[i][j]);
32 for(int j=1,i;j<=top;j++)
33 {
34 int now=que[j];//当前的工件号
35 int id=mach[now][Rank[j]];//当前的工序的机器号
36 for(i=Lasttime[now]+1;;i++)
37 {
38 if(!work[id][i])//检查是否可以插入任务
39 if(check(i,Time[now][Rank[j]],id))break;
40 }
41 int End=i+Time[now][Rank[j]]-1;
42 for(i;i<=End;i++)work[id][i]=1;
43 Lasttime[now]=End;
44 ans=max(ans,End);
45 }
46 cout<<ans<<endl;
47 return 0;
48 }