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
57
58
59
60
61
62
63
#include<cstdio>

#include "message.h"
#include "dzialka.h"

using namespace std;

int main() {

    int w = GetFieldWidth();
    int h = GetFieldHeight();
    int nodes_num = NumberOfNodes();
    int my_id = MyNodeId();

    int part_size = (h - 1) / nodes_num + 1;
    int part_start = my_id * part_size;

    bool* row = new bool[w]();

    long long result = 0ll;
    for (int i = part_start; i < part_start + part_size && i < h; i++) {
	for (int j = 0; j < w; j++) {
	    row[j] = true;
	}

	for (int t = i; t < h; t++) {
	    for (int j = 0; j < w; j++) {
		row[j] = row[j] && IsUsableCell(t, j);
	    }
	    
	    int curr_usable = 0;
	    for (int j = 0; j < w; j++) {
		if (row[j]) {
		    curr_usable++;
		} else if (curr_usable > 0) {
		    result += curr_usable * (curr_usable + 1) / 2;
		    curr_usable = 0;
		    //printf("[%d][%d] -> res=%lld\n", i, j, result);
		}
		//printf("%d ", field[i][j]);
	    }
	    if (curr_usable > 0) {
		result += curr_usable * (curr_usable + 1) / 2;
		//printf("[%d] -> res=%lld\n", i, result);

	    }
	    //printf("\n");
	}
    }

    if (my_id > 0) {
	PutLL(0, result);
	Send(0);
    } else {
	for (int i = 1; i < nodes_num; i++) {
	    Receive(i);
	    result += GetLL(i);
	}
	printf("%lld\n", result);
    }

    return 0;
}