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
#include <iostream>
#include "message.h"
#include "krazki.h"

using namespace std;

int block_depth(int i,int NOD){
		for (int j=1;(j<=i)&&(j<=NOD);j++){
			if (HoleDiameter(i-j+1)<DiscDiameter(j)) return i-1;
		}
	return -1;	
}
int main() {
	int liczba=NumberOfNodes();
	int PH=PipeHeight();
	int NOD=NumberOfDiscs();
	if (liczba>PH) liczba=PH;
	if (MyNodeId()<liczba){	
		int result=block_depth(MyNodeId()+1,NOD);
		for (int i=MyNodeId()+1+liczba;(i<=PH)&&(result==-1);i=i+liczba){
			int result2=block_depth(i,NOD);
			result=result2; 
		}
		if (MyNodeId()>0){
			PutInt(0, result);
    		Send(0);
		}
		else {
			for (int instancja = 1; instancja < liczba; ++instancja) {
      			Receive(instancja);
      			int result2=GetInt(instancja);
      			if (((result2<result)&&(result2!=-1))||((result==-1)&&(result2!=-1))) result=result2;
    		}
			if (result==-1) {
				if (PH>=NOD) cout<<PH-NOD+1<<endl;
				else cout<<0<<endl;
			}	 
			else if (result-NOD<0) cout<<0<<endl;
			else cout<<result-NOD+1<<endl;
		}
	}
	return 0;
}