This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
const int Limit = 1e6;
const int LimitVal = 1000;
const int dirx[4] = {-1, 0, 1, 0};
const int diry[4] = {0, 1, 0, -1};
const int Cornerdirx[4] = {-1, 1, 1, -1};
const int Cornerdiry[4] = {1, 1, -1, -1};
int m, n, k;
vector<vector<int>> Grid, Status;
vector<int> Dsu;
bool InGrid(int& i, int& j) {
    return (0 <= i && i < m && 0 <= j && j < n);
}
int Zip(int& i, int& j) {
    return i * n + j;
}
int FindPar(int u) {
    if (u == Dsu[u]) return u;
    return Dsu[u] = FindPar(Dsu[u]);
}
bool Union(int u , int v) {
    u = FindPar(u);
    v = FindPar(v);
    if (u == v) return false;
    Dsu[v] = u;
    return true;
}
vector<pair<int, int>> Component[Limit];
vector<vector<bool>> isVisited;
vector<pair<int, int>> isVisited_RollBack;
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    cin >> m >> n;
    Grid.resize(m + 1, vector<int>(n + 1));
    Status.resize(m + 1, vector<int>(n + 1));
    Dsu.resize(n * m + 1);
    for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
        cin >> Grid[i][j], Dsu[Zip(i, j)] = Zip(i, j);
    cin >> k;
    for (int i = 1; i <= k; i++) {
        int x, y;
        cin >> x >> y;
        Status[x][y] = true;
    }
    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {
            if (Status[i][j] == false) continue;
            for (int dir = 0; dir < 4; dir++) {
                pair<int, int> CloseAdj = {i + dirx[dir], j + diry[dir]};
                pair<int, int> FarAdj = {i + 2 * dirx[dir], j + 2 * diry[dir]};
                pair<int, int> CornerAdj = {i + Cornerdirx[dir], j + Cornerdiry[dir]};
                if (InGrid(CloseAdj.first, CloseAdj.second) && Status[CloseAdj.first][CloseAdj.second] == true)
                    Union(Zip(i, j), Zip(CloseAdj.first, CloseAdj.second));
                if (InGrid(FarAdj.first, FarAdj.second) && Status[FarAdj.first][FarAdj.second] == true)
                    Union(Zip(i, j), Zip(FarAdj.first, FarAdj.second));
                if (InGrid(CornerAdj.first, CornerAdj.second) && Status[CornerAdj.first][CornerAdj.second] == true)
                    Union(Zip(i, j), Zip(CornerAdj.first, CornerAdj.second));
            }
        }
    }
    for (int i = 0; i < m; i++)
    for (int j = 0; j < n; j++)
        if (Status[i][j] == true) 
            Component[FindPar(Zip(i, j))].emplace_back(i, j);
    int Ans = 0;
    isVisited.resize(m + 1, vector<bool>(n + 1));
    for (int i = 0; i < n * m; i++) {
        if (Component[i].empty()) continue;
        int CoverNum = 0, MaxSum = 0;
        for (auto& c: Component[i]) {
            MaxSum += Grid[c.first][c.second];
            for (int dir = 0; dir < 4; dir++) {
                int Cx = c.first + dirx[dir];
                int Cy = c.second + diry[dir];
                if (!InGrid(Cx, Cy) || Status[Cx][Cy] == true) continue;
                if (!isVisited[Cx][Cy]) {
                    isVisited[Cx][Cy] = true;
                    isVisited_RollBack.emplace_back(Cx, Cy);
                    CoverNum++;
                }
            }
        }
        if (CoverNum < 3 * (int)Component[i].size()) {
            cout << "No";
            return 0;
        } else if (CoverNum == 3 * (int)Component[i].size()) {
            for (auto& c: isVisited_RollBack)
                MaxSum += Grid[c.first][c.second];
        } else {
            int MinVal = LimitVal;
            
            for (auto& c: isVisited_RollBack) {
                MaxSum += Grid[c.first][c.second];
                MinVal = min(MinVal, Grid[c.first][c.second]);
            }
            MaxSum -= MinVal;
        }
        Ans += MaxSum;
        for (auto& c: isVisited_RollBack)
            isVisited[c.first][c.second] = 0;
        isVisited_RollBack.clear();
    }
    cout << Ans;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |