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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
// Jedna instancja wypisuje maksymalny wzrost.

#include "message.h"
#include "teatr.h"
#include "bits/stdc++.h"

#define MAXK 6

using namespace std;

int main() {
  int n = GetN();
  int ilosc_instancji = NumberOfNodes();
  int moj_numer = MyNodeId();
  
  bool jestem_pierwszy = (moj_numer == 0);
  bool jestem_ostatni = (moj_numer == (ilosc_instancji - 1));
  
  int rozmiar_bloku = n / ilosc_instancji;
  
  int moja_pierwsza_pozycja = rozmiar_bloku * moj_numer;
  int moja_ostatnia_pozycja;
  if(!jestem_ostatni) {
  	 moja_ostatnia_pozycja = (rozmiar_bloku * (moj_numer + 1) - 1);
  }
  else {
  	 moja_ostatnia_pozycja = (n - 1);
  }
  
  int ile_wystapien_danego_elementu[MAXK];
  int ile_wystapien_danego_elementu_z_lewej[MAXK];
  int ile_wystapien_danego_elementu_sumarycznie[MAXK];
  for(int i = 1; i < MAXK; i++) {
  	ile_wystapien_danego_elementu[i] = 0;
  	ile_wystapien_danego_elementu_z_lewej[i] = 0;
    ile_wystapien_danego_elementu_sumarycznie[i] = 0;
  }
  
  for(int i = moja_pierwsza_pozycja; i <= moja_ostatnia_pozycja; i++) {
  	ile_wystapien_danego_elementu[GetElement(i)]++;
  }
  
  for(int i = 1; i < MAXK; i++) {
  	ile_wystapien_danego_elementu_sumarycznie[i] = ile_wystapien_danego_elementu[i];
  }
  
  if(!jestem_pierwszy) {
  	Receive(moj_numer - 1);
  	for(int i = 1; i < MAXK; i++) {
  		ile_wystapien_danego_elementu_z_lewej[i] = GetInt(moj_numer - 1);
  	}
  	
  	for(int i = 1; i < MAXK; i++) {
  		ile_wystapien_danego_elementu_sumarycznie[i] += ile_wystapien_danego_elementu_z_lewej[i];
  	}
  }
  
  if(!jestem_ostatni) {
  	for(int i = 1; i < MAXK; i++) {
  		PutInt(moj_numer + 1, ile_wystapien_danego_elementu_sumarycznie[i]); 
  	}
  	Send(moj_numer + 1);
  }	
  
  for(int i = 1; i < MAXK; i++) {
  	ile_wystapien_danego_elementu[i] = ile_wystapien_danego_elementu_z_lewej[i];
  }
  
  long long ile_klotni_ode_mnie = 0;
  int elem;
  for(int i = moja_pierwsza_pozycja; i <= moja_ostatnia_pozycja; i++) {
  	elem = GetElement(i);
 	
 	for(int j = elem + 1; j < MAXK; j++) {
 		ile_klotni_ode_mnie += ile_wystapien_danego_elementu[j];	
	}
 	
  	ile_wystapien_danego_elementu[elem]++;
  }
  if(!jestem_ostatni) {
  	Receive(moj_numer + 1);
  	ile_klotni_ode_mnie += GetLL(moj_numer + 1);
  }
  
  if(!jestem_pierwszy) {
  	PutLL(moj_numer - 1, ile_klotni_ode_mnie); 
  	Send(moj_numer - 1);
  }	
  
  if(moj_numer == 0) {
  	cout << ile_klotni_ode_mnie << endl;
  }
  
}