#include<bits/stdc++.h>
#define int long long
using namespace std;
const int ma=5e5+100;
int n,m;
int cp[300][300],tim[300][300];
int pur[ma];
int vis[ma];//该机器是否在被用,以及结束时间
int ing[ma];//该工件是否在被加工
int used[ma];//机器被谁用的
int ans=0;//最后答案
int done[ma];//哪个工序已经完成了,或正在被完成
int cnt[5000];//标记哪个工件完成了
int num[4000];//每个工件加工的第几道工序
int na=0;
int tool[30];
int Ind;
inline int read(){
int x=0,f=1;char ch=getchar();
while (!isdigit(ch)){if (ch=='-') f=-1;ch=getchar();}
while (isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
void Deal(){
int t=0;
while(1){
for(int i=1;i<=n;i++){
if(vis[cp[i][num[i]]]<=t && used[cp[i][num[i]]]==i && ing[i]){
vis[cp[i][num[i]]]=0;
used[cp[i][num[i]]]=0;
ing[i]=0;
na++;
}
}
memset(tool,0,sizeof tool);
Ind=0;
for(int i=1;i<=n*m;i++){
if(!vis[cp[pur[i]][num[pur[i]]+1]] && !used[cp[pur[i]][num[pur[i]]+1]] && !ing[pur[i]] && !cnt[i] ){
//机子是空的
//没人用
//这个工件不在加工
//当前工序没加工过
int tag=0;
for(int j=1;j<=Ind;j++){
if(t+tim[pur[i]][num[pur[i]]+1] > vis[cp[pur[tool[j]]][num[pur[tool[j]]]]] && cp[pur[i]][num[pur[i]]+1]==cp[pur[tool[j]]][num[pur[tool[j]]]+1]) tag=1;
}
if(tag) continue;
++num[pur[i]];
vis[cp[pur[i]][num[pur[i]]]]=t+tim[pur[i]][num[pur[i]]];
used[cp[pur[i]][num[pur[i]]]]=pur[i];
ing[pur[i]]=i;
cnt[i]=1;
}
else if( ing[pur[i]] && !cnt[i]){
tool[++Ind]=i;
}
}
if(na==n*m){
ans=t;
return;
}
t++;
}
}
signed main(){
m=read(),n=read();
memset(num,0,sizeof num);
for(int i=1;i<=n*m;i++){
pur[i]=read();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) cp[i][j]=read();
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++) tim[i][j]=read();
}
Deal();
cout<<ans;
}
WA #9 #10 两个点