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>
#include <vector>
#include <map>
#include <queue>
#include <deque>
#include <algorithm>
#define ll long long
#define FOR(i,a) for (long long i=0;i<a;i++)
#define FORN(i,a) for (long long i=1;i<=a;i++)
#define pb push_back
#define mp make_pair
#define ff first
#define ss second 
using namespace std;
/*
ll bin1(ll a,ll b){
   if (b==0)return 1;
   if (b==1)return a;
   if (b&1)return bin(a,b-1)*a;
   c=bin(a,b/2);
   return c*c;
}
ll bin2(ll a,ll b){
	ll res=1;
	while(b){
		if(b&1){
			res*=a;
		}
		a*=a;
		b/=2;
	}
	return res;
}
*/
vector <string> s;
ll ans=0;
ll a[3001][3001];
ll d[3003][3003];
void solve(){
	ll n,m;
	cin>>n>>m;
	for(ll i=1;i<=n;i++){
		string h;
		cin>>h;
		s.pb(h);
	}
	for(ll i=0;i<n;i++){
		ll h=0;
		for(ll j=0;j<m;j++){
			if (s[i][j]=='O'){
				h++;
			}
			a[i][j]=h;
		}
	}
	for(int i=0;i<m;i++){
		ll h=0;
		for (ll j=0;j<n;j++){
			if (s[j][i]=='I'){
				h++;
			}
			d[j][i]=h;
		}
	}
	for(ll i=0;i<n;i++){
		for (ll j=0;j<m;j++){
			if (s[i][j]=='J'){
				ans+=((a[i][m-1]-a[i][j])*(d[n-1][j]-d[i][j]));
			}
		}
	}
	cout<<ans;
}
int main(){
	//srand( time(0));
	//rand()
	ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	//freopen("sum.in", "r", stdin);
	//freopen("sum.out", "w", stdout);
    ll c=1;
    while(c--){
    	solve();
	}
    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... |