//四个参数,表示每种牌的使用情况;
//f[i][j][k][v]=max(f[i-1][j][k][v],f[i][j-1][k][v],f[i][j][k-1][v],f[i][j][k][v-1])+a[i+j*2+k*3+v*4];
#include<cstdio>
int n,m,a[352],b[5],c[5]={0},ans;
int sz[40][40][40][40]={0};
int max(int a,int b){
return a>b?a:b;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++) scanf("%d",a+i);
for(int i=1;i<=m;i++){
scanf("%d",&ans);
b[ans]++; //累计每种牌的张数;
}
for(int x=0;x<=b[1];x++)
for(int y=0;y<=b[2];y++)
for(int l=0;l<=b[3];l++)
for(int r=0;r<=b[4];r++){
if(x!=0) sz[x][y][l][r]=max(sz[x][y][l][r],sz[x-1][y][l][r]);
if(y!=0) sz[x][y][l][r]=max(sz[x][y][l][r],sz[x][y-1][l][r]);
if(l!=0) sz[x][y][l][r]=max(sz[x][y][l][r],sz[x][y][l-1][r]);
if(r!=0) sz[x][y][l][r]=max(sz[x][y][l][r],sz[x][y][l][r-1]);//像求走楼梯的方法一样求;
sz[x][y][l][r]+=a[x+y*2+l*3+r*4];
}
printf("%d",sz[b[1]][b[2]][b[3]][b[4]]);
return 0;
}