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

long long int const MAX = 1000000000000000000LL;

int main(){

    if(MyNodeId() == 0){
   		
	   long long int tmp,h,d;
	   h = PipeHeight();
       d = NumberOfDiscs();
       if(d>h){
    		printf("0");
	   }else {
	   	if(h > 30000000LL){
			   	long long int di, ho, j, d, n;
			    d = PipeHeight();
			    n = NumberOfDiscs();	
		    	bool zero=false;
		    	j=d;
		    	for(long long int i=1; i<=n; ++i){
		    		di=DiscDiameter(i);
		    		do{
		    			if(j==0){
		    				zero=true;
		    				break;
		    			}
		    			ho = HoleDiameter(j);
		    			j--;
					}while(di>ho);
					if(j==0){
						if(zero){
							break;
						}
					}
				}
				if(!zero) j++;
		    	printf("%d", j);
		   }else{
			   long long int* hole = new long long int[h+1];
			   long long int* disc = new long long int[d+1];
			   long long int Hmax = MAX;
			   long long int Dmax = MAX;
			    for(long long int i=1; i<=h; ++i){
			    	tmp = HoleDiameter(i);
			    	if(tmp < Hmax) Hmax=tmp;
			    	hole[i]=Hmax;
				}
		    	int j=h;
		    	bool zero=false;
		    	for(int i=1; i<=d; ++i){
		    		long long int dd=DiscDiameter(i);
		    		long long int hh=0;
		    		do{
		    			if(j==0){
		    				zero=true;
		    				break;
		    			}
		    			hh = hole[j];
		    			j--;
		    			//printf("%d > %d\n", dd, hh);
					}while(dd>hh);
					if(j==0){
						if(zero){
							break;
						}
					}
				}
				if(!zero) j++;
		    	printf("%d", j);
		    	delete [] hole;
		    	delete [] disc;
		    	
			   }
	   
		}
    }
	
}