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 <cstdio>
#include <algorithm>
#include "krazki.h"
#include "message.h"
#define NAJ 1000000000000000000LL
#define MAKS 2500010
using namespace std;
typedef long long int lld;
lld szer[MAKS];
int sufprz(int a, int b)
{
    if(a%b==0)return a/b;
    return a/b+1;
}
int main()
{
    int N = NumberOfNodes();
    int ja = MyNodeId();
    
    int n = PipeHeight();
    int m = NumberOfDiscs();
    if(m>n)
    {
        if(ja==0)puts("0");
        return 0;
    }
    
    int dl=sufprz(n,N);
    int pocz=ja*dl; int kon=min(ja*dl + dl,n);
    if(pocz>=kon)return 0;
    //printf("%d: [%d %d]\n",ja,pocz,kon-1);
    for(int i=pocz;i<kon;i++)szer[i-pocz]=HoleDiameter(i+1);
    /*printf("%d: ",ja);
    for(int i=pocz;i<kon;i++)printf("%lld ",szer[i-pocz]);
    puts("");*/
    
    lld poczmin;
    if(ja>0)
    {
        Receive(ja-1);
        poczmin=GetLL(ja-1);
    }
    else poczmin=NAJ;
    
    szer[0]=min(szer[0],poczmin);
    for(int i=pocz+1;i<kon;i++)szer[i-pocz]=min(szer[i-pocz],szer[i-pocz-1]);
    
    int aktKrazek;
    if(kon<n)
    {
        PutLL(ja+1,szer[kon-1-pocz]);
        Send(ja+1);
        // ----
        Receive(ja+1);
        aktKrazek=GetInt(ja+1);
    }
    else aktKrazek=1;
    
    if(aktKrazek<=m)
    {
        lld krazekSzer = DiscDiameter(aktKrazek);
        for(int i=kon-1;i>=pocz;i--)
        {
            if(szer[i-pocz]<krazekSzer)continue;
            aktKrazek++;
            if(aktKrazek<=m)krazekSzer=DiscDiameter(aktKrazek);
            else
            {
                printf("%d\n",i+1);
                break;
            }
        }
    }
    
    if(ja>0)
    {
        PutInt(ja-1,aktKrazek);
        Send(ja-1);
    }
    else if(aktKrazek<=m) puts("0");
}