func_code_string: #include <bits/stdc++.h>   using namespace std;   default_random_engine gen(42);   uniform_real_distribution<double> ran(0, 1);   void vin(std::vector<int> &a) {     for (auto &x : a) cin >> x;   }   void vout(std::vector<int> &a) {     for (auto x : a) cout << x <<    ;     cout << endl;   }   bool vm(array<pair<int, int>, 2> m) {     if (abs(m[0].first - m[1].first) + abs(m[0].second - m[1].second) != 3)       return 0;     if (m[0].first == m[1].first || m[0].second == m[1].second) return 0;     return 1;   }   pair<int, int> operator+(const pair<int, int> &a, const pair<int, int> &b) {     return {a.first + b.first, a.second + b.second};   }   std::vector<pair<int, int> > mo{{1, 2},   {2, 1},   {2, -1}, {1, -2},                                   {-1, -2}, {-2, -1}, {-2, 1}, {-1, 2}};   array<std::vector<std::vector<int> >, 2> dp;   int n, m;   void initdp() {     for (int qw = 0; qw < 2; qw++) {       dp[qw].resize(n, std::vector<int>(m, -1));       priority_queue<tuple<int, int, int>, std::vector<tuple<int, int, int> >,                      greater<tuple<int, int, int> > >           pq;       pq.emplace(make_tuple(0, n / 2 - 1 + qw, m / 2 - 1));       while (!pq.empty()) {         int x, y, d;         tie(d, x, y) = pq.top();         pq.pop();         if (dp[qw][x][y] != -1) continue;         dp[qw][x][y] = d;         for (auto move : mo) {           pair<int, int> t = move + make_pair(x, y);           if (t.first >= 0 && t.first < n && t.second >= 0 && t.second < m &&               dp[qw][t.first][t.second] == -1)             pq.emplace(make_tuple(d + 1, t.first, t.second));         }       }     }   }   int dist(pair<int, int> b, bool t) { return dp[t][b.first][b.second]; }   int end(array<pair<int, int>, 2> a, bool t) {     if (vm(a)) return t;     if (a[0].first == n / 2 - 1 && a[0].second == m / 2 - 1) return 0;     if (a[1] == make_pair(n / 2, m / 2 - 1)) return 1;     return -1;   }   pair<int, int> w;   double rek(array<pair<int, int>, 2> a, bool t, int rd = 6, double mx = INT_MAX,              double mn = INT_MIN) {     pair<int, int> mw = {0, 0};     if (end(a, t) != -1)       return ((end(a, t) ? 1000 : -1000) + ran(gen) * .001) * pow(1.01, rd);     if (rd == 0) {       double d[2][2];       for (int i = 0; i < 2; i++)         for (int j = 0; j < 2; j++) d[i][j] = dist(a[i], j);       d[t][0] -= .5;       d[t][1] -= .5;       return (d[0][0] - d[1][1] + (d[0][1] - d[1][0]) * .1 + ran(gen) * .001) *              pow(1.01, rd);     }     double rt = t ? -100000 : 100000;     priority_queue<array<pair<int, int>, 2>,                    std::vector<array<pair<int, int>, 2> >,                    greater<array<pair<int, int>, 2> > >         pq;     for (auto x : mo) {       pair<int, int> c = a[t] + x;       if (c.first >= 0 && c.first < n && c.second >= 0 && c.second < m)         pq.emplace(array<pair<int, int>, 2>{             make_pair(dp[t][c.first][c.second], dp[!t][c.first][c.second]), c});     }     assert(!pq.empty());     while (!pq.empty()) {       array<pair<int, int>, 2> n = a;       n[t] = pq.top()[1];       pq.pop();       double r = rek(n, !t, rd - 1, mx, mn);       if ((t && r > rt) || (!t && r < rt)) {         rt = r;         mw = n[t];       }       if ((t && rt > mx) || (!t && rt < mn)) break;       if (t)         mn = max(mn, rt);       else         mx = min(mx, rt);     }     w = mw;     return rt;   }   int main() {     ios_base::sync_with_stdio(0);     cin.tie(0);     cin >> n >> m;     initdp();     int xWI, yWI, xBL, yBL;     cin >> xWI >> yWI >> xBL >> yBL;     xWI--;     yWI--;     xBL--;     yBL--;     array<pair<int, int>, 2> a = {make_pair(xWI, yWI), make_pair(xBL, yBL)};     if (vm(a)) {       cout <<  WHITE n  << xBL + 1 <<     << yBL + 1 <<   n ;       return 0;     }     double r = rek(a, 0);     int me;     if (fabs(r) > 500)       me = r > 0;     else {       int fr = ((xWI + yWI + xBL + yBL) % 2);       int df = dp[fr][a[fr].first][a[fr].second],           da = dp[fr][a[!fr].first][a[!fr].second];       cerr << df <<     << da <<   n ;       if (df + 1 + fr <= da)         me = fr;       else         me = !fr;     }     cout << (me ?  BLACK  :  WHITE ) << endl;     int t = 0;     while (true) {       if (t == me) {         rek(a, t);         cout << w.first + 1 <<     << w.second + 1 << endl;         if (w == a[!t]) return 0;         if (!vm(a) && w == make_pair(n / 2 - 1 + t, m / 2 - 1)) return 0;       } else {         cin >> w.first >> w.second;         w.first--;         w.second--;       }       a[t] = w;       t = !t;     }   }   