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 <iostream>
#include <vector>
using namespace std;
int main() {
    int H, W;
    cin >> H >> W;
    vector<vector<int>> grid;
    for (int i = 0; i < H; ++i) {
        string st;
        cin >> st;
        vector<int> row;
        for (int j = 0; j < W; ++j) {
            if (st[j] == 'J')
                row.push_back(0);
            else if (st[j] == 'O')
                row.push_back(1);
            else if (st[j] == 'I')
                row.push_back(2);
        }
        grid.push_back(row);
    }
    vector<vector<int>> grido(H + 1, vector<int>(W + 1, 0));
    vector<vector<int>> gridi(H + 1, vector<int>(W + 1, 0));
    // Calculate 'o' values
    for (int row = 0; row < H; ++row) {
        for (int col = W - 1; col >= 0; --col) {
            int num = (grid[row][col] == 1);
            grido[row][col] = grido[row][col + 1] + num;
        }
    }
    // Calculate 'i' values
    for (int col = 0; col < W; ++col) {
        for (int row = H - 1; row >= 0; --row) {
            int num = (grid[row][col] == 2);
            gridi[row][col] = gridi[row + 1][col] + num;
        }
    }
    long long ans = 0;
    for (int row = 0; row < H; ++row) {
        for (int col = 0; col < W; ++col) {
            if (grid[row][col] == 0) {
                ans += grido[row][col + 1] * gridi[row + 1][col];
            }
        }
    }
    cout << ans << endl;
    return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |