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

using namespace std;

long long n,m;
long long t[200000005];

int main()
{
    long long id,non,res,frm,to,x,minnn,maxxx,ZERO=0;
    n=PipeHeight();
    m=NumberOfDiscs();
    id=MyNodeId();
    non=NumberOfNodes();
    if(m%non==0) 
    {
        frm=(non-id-1)*(m/non)+1;
        to=frm+(m/non)-1;
    }
    else
    {
        frm=(non-id-1)*((m/non)+1)+1;
        to=min(to=frm+((m/non)+1)-1,m);
    }
    res=n;
    t[0]=1000000001L;
    for(long long i=1;i<=n;i++)
    {
        x=HoleDiameter(i);
        t[i]=min(x,t[i-1]);
    }
    for(long long i=frm;i<=to;i++)
    {
        x=DiscDiameter(i);
        while (res>0 && t[res]<x){res--; }
        res--;
        if (minnn==-1) minnn=max(ZERO,res+1);
    }
    maxxx=max(ZERO,res+1);
    if (id == non-1)
    {
        PutLL(id-1, maxxx);
        Send(id-1);
    }
    else if (id > 0)
    {
        Receive(id+1);
        x=GetLL(id+1);
        if(x>=minnn)
        {
            maxxx=x-(to-frm+1);
        }
        maxxx=max(maxxx,ZERO);
        PutLL(id-1, maxxx);
        Send(id-1);
    } 
    else
    {
        Receive(id+1);
        x=GetLL(id+1);
        //cout
    }
    return 0;
}