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 "kollib.h"
#include "message.h"
#include <iostream>
using namespace std;

class Chodzenie{
	public:
		int start = 0;
		int poprzedni = 0;
		int obecny = 0;
		int koniec = 0;
		int dlugoscDrogi = 0;
	Chodzenie(){
	}
	
	void setZapytanie(int start, int koniec){
		this->start = start;
		this->koniec = koniec;
		this->obecny = start;
		this->dlugoscDrogi = 0;
	}
	
	bool idzDalej(){ // true jesli doszlo
		if (obecny == koniec)
			return true;
		++dlugoscDrogi;
		int pierwszySasiad = FirstNeighbor(obecny);
		int drugiSasiad = SecondNeighbor(obecny);
		if (czyToPoczatek()){
			if (pierwszySasiad == koniec || drugiSasiad == koniec)
				return true;
			poprzedni = start;
			obecny = pierwszySasiad;
		}
		else{
			if (pierwszySasiad == poprzedni){
				poprzedni = obecny;
				obecny = drugiSasiad;
			}
			else{
				poprzedni = obecny;
				obecny = pierwszySasiad;
			}
		}
		return false;
		
	}
	
	bool czyToPoczatek(){
		return dlugoscDrogi == 0;
	}
};

int main() {
	int N = NumberOfQueries();
	int poczatek = ((MyNodeId() * N) / NumberOfNodes())+1;
  	int koniec = (((MyNodeId() + 1) * N) / NumberOfNodes())+1;
  	int liczbaUczniow = NumberOfStudents();
	Chodzenie h = Chodzenie();
	
	PutInt(0, koniec-poczatek);
  	
  	for (int i = poczatek; i < koniec; ++i) {	
	  	h.setZapytanie(QueryFrom(i), QueryTo(i));
	  	while(!h.idzDalej()){
	  	}
		int droga = min(liczbaUczniow-h.dlugoscDrogi, h.dlugoscDrogi);
		if (MyNodeId() > 0) {
		    PutInt(0, droga);
		}
		else {
		    cout << droga << endl;
		}

	}
	if (MyNodeId() > 0){
		Send(0);
	}
	else{
		for (int instancja = 1; instancja < NumberOfNodes(); ++instancja) {
		      Receive(instancja);
		      int iloscWyslanychDanych = GetInt(instancja);
		      for (int i = 0; i<iloscWyslanychDanych; ++i){
		      	cout << GetInt(instancja) << endl;	
		      }
		}
	}
	return 0;
}