#include "hexagon.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll mod = 1e9 + 7;
int draw_territory(int N, int A, int B, vector<int> D, vector<int> L) {
int n = 2400;
vector<vector<int>> G(n * n);
int pos = 1200 * n + 1200;
unordered_set<int> s;
vector<int> C = {0, n, n + 1, 1, -n, -n - 1, -1};
for (int i = 0; i < N; i++) {
for (int j = 0; j < L[i]; j++) {
pos += C[D[i]];
s.insert(pos);
}
}
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (i != 0) G[i * n + j].push_back((i - 1) * n + j);
if (i < n - 1) G[i * n + j].push_back((i + 1) * n + j);
if (j != 0) G[i * n + j].push_back(i * n + j - 1);
if (j < n - 1) G[i * n + j].push_back(i * n + j + 1);
if (i != 0 && j != 0) G[i * n + j].push_back((i - 1) * n + (j - 1));
if (i < n - 1 && j < n - 1) G[i * n + j].push_back((i + 1) * n + (j + 1));
}
}
vector<int> dist(n * n, 1e9);
vector<bool> seen(n * n, false);
seen[0] = true;
dist[pos] = 0;
queue<int> q;
q.push(0);
while (!q.empty()) {
int po = q.front();
q.pop();
for (int x : G[po]) {
if (seen[x] || s.count(x)) continue;
q.push(x);
seen[x] = true;
}
}
q.push(pos);
while (!q.empty()) {
int po = q.front();
q.pop();
for (int x : G[po]) {
if (dist[x] != 1e9 || seen[x]) continue;
q.push(x);
dist[x] = dist[po] + 1;
}
}
ll ans = 0;
for (int i = 0; i < n * n; i++) {
if (seen[i]) continue;
ans += A + (ll)B * dist[i];
ans %= mod;
}
return (int)((ans + mod) % mod);
}