#include <iostream> #include <algorithm> using namespace std; const int N(25); struct item{ int w[N]; int t[N]; int now; int s; }; int order[N*N]={0}; item data[N]; bool mach[N][N*N]={false}; int main() { for(int i=0;i<N;i++) { fill(data[i].w,data[i].w+N,0); fill(data[i].t,data[i].w+N,0); } int m,n,ans(0); cin>>m>>n; for(int i=1;i<=m*n;i++) cin>>order[i]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>data[i].w[j]; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>data[i].t[j]; for(int i=1;i<=n;i++) data[i].now=1,data[i].s=1; for(int i=1;i<=m*n;i++) { int x(order[i]),no(data[x].now), ma(data[x].w[no]),t(data[x].t[no]),p(data[x].s); bool find=false; while(!find) { if(mach[ma][p]==false) { int j; for(j=0;j<t;j++) if(mach[ma][p+j]) break; if(j==t) { for(j=0;j<t;j++) mach[ma][p+j]=true; data[x].now++; data[x].s=p+j; ans=max(ans,p+j-1); find=true; } else p=p+j; } else p++; } } cout<<ans<<endl; return 0; } /************************************************************** Problem: 2266 User: admin Language: C++ Result: Accepted Time:62 ms Memory:2096 kb ****************************************************************/