#include <bits/stdc++.h>
#include "artclass.h"
using namespace std;
int count_component(int H, int W, int R[500][500], int G[500][500], int B[500][500], int delta) {
bool vis[500][500];
memset(vis, 0, sizeof(vis));
auto color_sum = [&](int x, int y) {
return R[x][y] + G[x][y] + B[x][y];
};
int ret = 0;
for (int i = 0; i < H; i++) {
for (int j = 0; j < W; j++) {
if (vis[i][j]) continue;
ret++;
queue<pair<int, int>> bfs;
bfs.emplace(i, j);
while (!bfs.empty()) {
auto [x, y] = bfs.front();
bfs.pop();
if (vis[x][y]) continue;
vis[x][y] = true;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};
for (int d = 0; d < 4; d++) {
int nx = x + dx[d];
int ny = y + dy[d];
if (nx < 0 || nx >= H || ny < 0 || ny >= W) continue;
if (abs(color_sum(x, y) - color_sum(nx, ny)) <= delta) {
bfs.emplace(nx, ny);
}
}
}
}
}
return ret;
}
double info_16[5][2] = {
{0,0},
{13010.111, 11730.387},
{58501.000, 24981.392},
{91721.667, 24119.511},
{617.333, 525.352}
};
double info_64[5][2] = {
{0,0},
{2117.778, 3741.400},
{2733.667, 3466.084},
{25493.556, 12126.989},
{4.333, 4.387}
};
int get_best(int H, int W, int R[500][500], int G[500][500], int B[500][500], vector<int> can, int delta, double info[5][2]) {
int cnt = count_component(H, W, R, G, B, delta);
double cv = 1e9;
int ret = 0;
for (int i : can) {
double v = (double)abs(cnt-info[i][0])/info[i][1];
if (v < cv) {
cv = v;
ret = i;
}
}
return ret;
}
int style(int H, int W, int R[500][500], int G[500][500], int B[500][500]) {
int stage_1 = get_best(H, W, R, G, B, {1, 2, 3, 4}, 16, info_16);
if (stage_1 == 1) {
// candidate = {1, 4}
return get_best(H, W, R, G, B, {1, 4}, 64, info_64);
} else if (stage_1 == 2) {
// candidate = {1, 2, 3}
return 2;
} else if (stage_1 == 3) {
// candidate = {2, 3}
return get_best(H, W, R, G, B, {2, 3}, 64, info_64);
} else {
// candidate = {4}
return 4;
}
}