/*一共有四张卡片,代表所能走的不同的步数,也就是当前数的取得,有可能是在前一个数的基础上,走了一步/两步/三步/四步而来,因而考虑用一个四维的状态数组f[i][j][k][h]分别表示卡片的张数,DP列出所有可能的状态即可
要注意的细节:
1)第一格是唯一的起点,所以f[0][0][0][0]=a[1],也就是一张卡片都没有用的时候,取得的初值
2)如果用了第一张卡片,则用f[1][0][0][0]表示,有f[1][0][0][0]=f[0][0][0][0]+a[2],也就是从第一格开始,走了一格,实际上要取的数是a[2],也就是a[t+1],
其中t为卡片所规定的步数
3)每张卡片只能用一次,但每一种卡片不只一张,因此在输入的时候,需要做个统计
4)注意动规的初值,循环要从0开始,表示没有用到相应的卡片
*/
#include <iostream>  
#define N 360  
#define M 42  
using namespace std;  
int n,m,x,a[N],b[5];  
int f[M][M][M][M];  
int main()  
{  
    cin>>n>>m;  
    for(int i=1;i<=n;i++)  
      cin>>a[i];  
    for(int i=1;i<=m;i++)  
    {  
        cin>>x;  
        b[x]++;  
    }  
    f[0][0][0][0]=a[1];  
    for(int i=0;i<=b[1];i++)  
      for(int j=0;j<=b[2];j++)  
        for(int k=0;k<=b[3];k++)  
          for(int h=0;h<=b[4];h++)  
          {  
                x=i+j*2+k*3+l*4;  
                if(i) f[i][j][k][h]=max(f[i][j][k][h],f[i-1][j][k][h]+a[x+1]);  
                if(j) f[i][j][k][h]=max(f[i][j][k][h],f[i][j-1][k][h]+a[x+1]);  
                if(k) f[i][j][k][h]=max(f[i][j][k][h],f[i][j][k-1][h]+a[x+1]);  
                if(l) f[i][j][k][h]=max(f[i][j][k][h],f[i][j][k][h-1]+a[x+1]);  
          }  
    cout<<f[b[1]][b[2]][b[3]][b[4]]<<endl;  
    return 0;  
}