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
#include<cstdio>
#include "krazki.h"
#include "message.h"
long long a, mi[5000003], mini, k, n,m,last, moj,maksi=4000000, d;
int main()
{
	n=PipeHeight(); m=NumberOfDiscs();  moj=MyNodeId();
	if(moj==0)
	{
		d=maksi;
		if(n<d)d=n;
		mini=HoleDiameter(1);
		mi[1]=mini;
		for(int i=2; i<=d; i++)
		{
			a=HoleDiameter(i);
			if(a<mini)mini=a;
			mi[i]=mini;
		}
		if(n>maksi)
		{
			PutLL(moj+1, mini);
	    	Send(moj+1);	
		}
	}
	else
	{
		if(n<=moj*maksi)return 0;
		Receive(moj-1);
      	mini=GetLL(moj-1);
      	d=maksi*moj;
      	for(int i=1; i<=maksi; i++)
      	{
      		if(i+d<=n)a=HoleDiameter(i+d);
			if(a<mini)mini=a;
			mi[i]=mini;
		}
		if(n>maksi*(moj+1))
		{
			PutLL(moj+1, mini);
	    	Send(moj+1);
		}
	}
	if(n<=maksi*(moj+1))
	{
		last=n;
		d=1;
	}
	else
	{
			last=maksi*(moj+1);
      		Receive(moj+1);
      		d = GetLL(moj+1);
      		if(d==0)return 0;
	}
	if(moj==0)
	{
			while(last>=0&&d<=m)
			{
				k=DiscDiameter(d);
				while(mi[last]<k&&last>=0)last--;
				last--;
				if(last<0)
				{
					printf("0");
					return 0;
				}
				d++;
			}
			printf("%lld", last+1);
			return 0;
	}
	else
	{	
		while(last>=maksi*moj&&d<=m)
		{
			k=DiscDiameter(d);
			while(mi[last-maksi*moj]<k&&last>maksi*moj)last--;
			last--;
			if(last>=maksi*moj)d++;
			if(last>=maksi*moj&&d>m)
			{
				printf("%lld", last+1);
				d=0;
				break;
			}
		}
			PutLL(moj-1, d);
	    	Send(moj-1);
	    	return 0;
	}
	
}