#include <iostream>
#include <vector>
#include <algorithm>
#include <queue>
#include <tuple>
#include <math.h>
int dx[4] = { 0,0,1,-1 };
int dy[4] = { 1,-1,0,0 };
using namespace std;
int map[65][65];
int ch[65][65];
int n, q, nn;
void melt() {
vector<pair<int, int> > V;
for (int i = 1; i <= nn; i++) {
for (int j = 1; j <= nn; j++) {
if (map[i][j] == 0) continue;
int tmp = 0;
for (int k = 0; k < 4; k++) {
int xx = i + dx[k];
int yy = j + dy[k];
if (xx > nn || xx <= 0 || yy > nn || yy <= 0) continue;
if (map[xx][yy] == 0) continue;
tmp++;
}
if (tmp < 3) V.push_back(make_pair(i, j));
}
}
int size = V.size();
for (int i = 0; i < size; i++) {
map[V[i].first][V[i].second]--;
}
}
void move(int a, int b, int len) {
int boxcnt = len / 2;
for (int k = 0; k < boxcnt; k++) {
int start_x = a + k;
int start_y = b + k;
int end_x = a + len - k - 1;
int end_y = b + len - k - 1;
int idx_x = end_x;
int idx_y = start_y;
int tmp2 = 0;
vector<int> tmp;
for (int i = start_x; i < end_x; i++) tmp.push_back(map[i][start_y]);
for (int i = start_x; i < end_x; i++) map[i][start_y] = map[end_x][idx_y++];
for (int i = start_y; i < end_y; i++) map[end_x][i] = map[idx_x--][end_y];
for (int i = end_x; i > start_x; i--) map[i][end_y] = map[start_x][idx_y--];
for (int i = end_y; i > start_y; i--) map[start_x][i] = tmp[tmp2++];
}
}
void go(int L) {
int len = pow(2,L);
for (int i = 1; i < nn; i += len) {
for (int j = 1; j < nn; j += len) {
move(i, j, len);
}
}
}
int main() {
//freopen("in1.txt", "rt", stdin);
cin >> n >> q;
nn = pow(2, n);
for (int i = 1; i <= nn; i++) {
for (int j = 1; j <= nn; j++) {
cin >> map[i][j];
}
}
int L;
for (int i = 0; i < q; i++) {
cin >> L;
if (L >= 1) go(L);
melt();
}
int ans1 = 0;
int ans2 = 0;
for (int i = 1; i <= nn; i++) {
for (int j = 1; j <= nn; j++) {
if (map[i][j] == 0) continue;
ch[i][j] = 1;
ans1 += map[i][j];
int sum = 1;
queue<pair<int, int> > Q;
Q.push(make_pair(i, j));
while (!Q.empty()) {
int x, y;
tie(x, y) = Q.front(); Q.pop();
for (int k = 0; k < 4; k++) {
int xx = x + dx[k];
int yy = y + dy[k];
if (xx > nn || xx <= 0 || yy > nn || yy <= 0) continue;
if (map[xx][yy] == 0) continue;
if (ch[xx][yy] == 0) {
Q.push(make_pair(xx, yy));
ch[xx][yy] = 1;
sum++;
if(ans2==0||ans2<sum)ans2=sum;
}
}
}
}
}
cout << ans1 << '\n';
cout << ans2 << '\n';
return 0;
}