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
 // #include<cstdio>
  #include<message.h>
  #include<cstdlib>
  #include<cstdio>
  #include<vector>
  #include "kollib.h"

  using namespace std;
  
  int main()
  {
	  int N = NumberOfStudents();
	  int Q = NumberOfQueries();
	  vector<int> mojeWyniki;
	  
	  int nodes = NumberOfNodes();
	  int myNodeId = MyNodeId();

	  for (long long d =  myNodeId  + 1; d   <= Q; d += nodes) 
	  {
		int wynik = 0;
		int q1 = QueryFrom(d);
		int q2 = QueryTo(d);
		int last = -1;
		while(q1!=q2)
		{
			++wynik;
			int tmp = FirstNeighbor(q2);
			if(tmp == last)
			{
				tmp = SecondNeighbor(q2);
			}
			last = q2;
			q2 = tmp;
		}
		if(wynik > N/2)
		{
			wynik = N - wynik;
		}
		if(myNodeId != 0)
			PutInt(0, wynik);
		else
		{
			mojeWyniki.push_back(wynik);
		}
	  }
	  
	  
	  
	  if ( myNodeId == 0) 
	  {  // MyNodeId == 0
		for (int instancja = 1; instancja < nodes; ++instancja) 
		{
		  Receive(instancja);
		}
		
		vector<int>::iterator it = mojeWyniki.begin();
		for (long long d =  1; d  <= Q; d ++) 
		{
			int node = (d-1)%nodes;
			if(node!=0)
			{
				printf("%d\n",GetInt(node));
			}
			else
			{
				printf("%d\n",*(it++));
			}
		}
	  }
	  else
	  {
		Send(0);
	  }
  
  return 0;
}