#include "message.h" #include "teatr.h" #include <iostream> #define T_SIZE 1000001 int TAB[T_SIZE]; int MAX_H = 1; void mb_read_msg(int src) { TAB[0] += GetInt(src); int m = GetInt(src); int h, hc; while (m > 0) { h = GetInt(src); hc = GetInt(src); for (int i = h + 1; i < T_SIZE && i < MAX_H; ++i) { TAB[0] += hc * TAB[i]; } TAB[h] += hc; if (h > MAX_H) { MAX_H = h; } --m; } } int main() { const int N = GetN(); const int ID = MyNodeId(); const int INSTANCES = NumberOfNodes(); int PART_SIZE; int END; int elem_i = 0, elem_k = 0; int counter = 0; for (int i = 0; i < T_SIZE; ++i) { TAB[i] = 0; } if (N % INSTANCES == 0) { PART_SIZE = N / INSTANCES; } else { PART_SIZE = N / INSTANCES + 1; } END = (ID + 1) * PART_SIZE; for (int i = ID * PART_SIZE; i < N && i < END; ++i) { elem_i = GetElement(i); if (TAB[elem_i] == 0) { ++counter; } ++TAB[elem_i]; if (elem_i > MAX_H) { MAX_H = elem_i; } for (int k = i + 1; k < N && k < END; ++k) { elem_k = GetElement(k); if (elem_k < elem_i) { ++TAB[0]; } } } if (ID == 0) { for (int i = 1; i < INSTANCES; ++i) { Receive(i); mb_read_msg(i); } std::cout << TAB[0]; } else { PutInt(0, TAB[0]); PutInt(0, counter); for (int i = 1; counter > 0 && i < T_SIZE; ++i) { if (TAB[i] > 0) { PutInt(0, i); PutInt(0, TAB[i]); --counter; } } Send(0); } return 0; }
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 | #include "message.h" #include "teatr.h" #include <iostream> #define T_SIZE 1000001 int TAB[T_SIZE]; int MAX_H = 1; void mb_read_msg(int src) { TAB[0] += GetInt(src); int m = GetInt(src); int h, hc; while (m > 0) { h = GetInt(src); hc = GetInt(src); for (int i = h + 1; i < T_SIZE && i < MAX_H; ++i) { TAB[0] += hc * TAB[i]; } TAB[h] += hc; if (h > MAX_H) { MAX_H = h; } --m; } } int main() { const int N = GetN(); const int ID = MyNodeId(); const int INSTANCES = NumberOfNodes(); int PART_SIZE; int END; int elem_i = 0, elem_k = 0; int counter = 0; for (int i = 0; i < T_SIZE; ++i) { TAB[i] = 0; } if (N % INSTANCES == 0) { PART_SIZE = N / INSTANCES; } else { PART_SIZE = N / INSTANCES + 1; } END = (ID + 1) * PART_SIZE; for (int i = ID * PART_SIZE; i < N && i < END; ++i) { elem_i = GetElement(i); if (TAB[elem_i] == 0) { ++counter; } ++TAB[elem_i]; if (elem_i > MAX_H) { MAX_H = elem_i; } for (int k = i + 1; k < N && k < END; ++k) { elem_k = GetElement(k); if (elem_k < elem_i) { ++TAB[0]; } } } if (ID == 0) { for (int i = 1; i < INSTANCES; ++i) { Receive(i); mb_read_msg(i); } std::cout << TAB[0]; } else { PutInt(0, TAB[0]); PutInt(0, counter); for (int i = 1; counter > 0 && i < T_SIZE; ++i) { if (TAB[i] > 0) { PutInt(0, i); PutInt(0, TAB[i]); --counter; } } Send(0); } return 0; } |