func_code_string: #include <bits/stdc++.h>   using namespace std;   int dx[] = {-1, 0, 1, 0};   int dy[] = {0, 1, 0, -1};   vector<int> f, col, wlk;   int Find(int a) {     if (f[a] == a) return a;     int fa = Find(f[a]);     f[a] = fa;     return fa;   }   void Union(int a, int b) {     int fa = Find(a);     int fb = Find(b);     if (fa == fb) return;     wlk[fa] += wlk[fb];     f[fb] = f[fa];   }   int main() {     ios_base::sync_with_stdio(0);     int n, m;     cin >> n >> m;     vector<vector<int> > pan(3 * n, vector<int>(3 * m, 0));     for (int i = 0; i < n; ++i)       for (int j = 0; j < m; ++j) cin >> pan[n + i][m + j];     vector<vector<int> > sym(3 * n, vector<int>(3 * m, -1));     for (int i = 0; i < n; ++i)       for (int j = 0; j < m; ++j) cin >> sym[n + i][m + j];     int x, y;     cin >> x >> y;     x = x - 1 + n;     y = y - 1 + m;     vector<vector<int> > spi(3 * n, vector<int>(3 * m));     spi[x][y] = 0;     int nr = 1, ileMam = 1, d = 1;     int akt_x = x, akt_y = y;     while (ileMam < 9 * n * m) {       for (int kier = 0; kier < 4; ++kier) {         for (int i = 0; i < d; ++i) {           akt_x += dx[kier];           akt_y += dy[kier];           if (akt_x >= 0 && akt_x < 3 * n && akt_y >= 0 && akt_y < 3 * m) {             spi[akt_x][akt_y] = nr;             ++ileMam;           }           ++nr;         }         if (kier == 1 || kier == 3) ++d;       }     }     map<int, vector<pair<int, pair<int, int> > > > M;     map<int, pair<int, int> > gdzieCol;     for (int i = 0; i < 3 * n; ++i) {       for (int j = 0; j < 3 * m; ++j) {         gdzieCol[pan[i][j]] = make_pair(i, j);         M[pan[i][j]].push_back(make_pair(-1, make_pair(i, j)));         int H = i * 3 * m + j;         f.push_back(H);         col.push_back(pan[i][j]);         wlk.push_back(1);         if (M.find(pan[i][j]) != M.end()) {           int Hroot = (M[pan[i][j]][0]).second.first * 3 * m +                       (M[pan[i][j]][0]).second.second;           Union(Hroot, H);         }       }     }     long long odp = 0;     queue<pair<int, int> > Q;     Q.push(make_pair(x, y));     while (!Q.empty()) {       pair<int, int> akt = Q.front();       Q.pop();       int colPan = col[Find(akt.first * 3 * m + akt.second)];       int colSym = sym[akt.first][akt.second];       if (colPan == 0 || colPan == colSym) continue;       if (M[colPan].size() != 0) {         for (int i = 0; i < M[colPan].size(); ++i) {           int wx = akt.first - x;           int wy = akt.second - y;           wx *= -1;           wy *= -1;           M[colPan][i].first = spi[M[colPan][i].second.first + wx]                                   [M[colPan][i].second.second + wy];         }         sort(M[colPan].begin(), M[colPan].end());         for (int i = 0; i < M[colPan].size(); ++i)           if ((M[colPan][i].second.first != x ||                M[colPan][i].second.second != y) &&               sym[M[colPan][i].second.first][M[colPan][i].second.second] != -1)             Q.push(M[colPan][i].second);         M[colPan].clear();       }       odp += wlk[Find(akt.first * 3 * m + akt.second)];       if (gdzieCol.find(colSym) != gdzieCol.end() && gdzieCol[colSym].first != -1)         Union(gdzieCol[colSym].first * 3 * m + gdzieCol[colSym].second,               akt.first * 3 * m + akt.second);       else {         col[Find(akt.first * 3 * m + akt.second)] = colSym;         gdzieCol[colSym] = akt;       }       gdzieCol[colPan] = make_pair(-1, -1);     }     cout << odp;     return 0;   }   