1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include "dzialka.h"
#include "message.h"
#include <iostream>
using namespace std;

int i=0, j=0, n, m, is=0, a;
long long sum=0, sums=0, ver[75001], st[75001], s[75001];

void push (long long a){
	long long bereft=0;
	while (is>0&&st[is-1]>a)	{
		is--;
		bereft+=s[is];
		sums=sums-s[is]*st[is];
		s[is]=st[is]=0;
	}
	
	sums=sums+(bereft+1)*a;
	
	if (is>0&&st[is-1]==a)	is--;
	
	s[is]+=bereft+1;
	st[is]=a;
	is++;
}

void clean(){
	while (is>=0){
		s[is]=st[is]=0;
		is--;
	}
	sums=0;
	is=0;
}

int main(){
	
	n=GetFieldHeight();
	m=GetFieldWidth();
	while (i<n){
		while (j<m){
			a=IsUsableCell(i, j);
			if (a==1)	ver[j]++, push(ver[j]);
			else ver[j]=0, clean();
			sum+=sums;
			j++;
		}
		clean(), sums=0;
		i++, j=0;
	}

if (MyNodeId() > 0)	return 0;

	cout<<sum;
	
return 0;}