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
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#include<iostream>
#include "message.h"
#include "krazki.h"

using namespace std;

long long MY_INF = 2500000000000000000LL;

int pocz, kon, mid; //long long?

long long max_krazkow;
int max_krazkow_index;

int min_ind;

long long x;
int ind_x,ost_res,poz;

bool zle;
char odp;

int main(){
    //1. wyznacz max z wszystkich krazkow:
    long long max_krazkow = -1;
    
    if(MyNodeId() > 0){
        //PutLL(0,max_krazkow);
        PutInt(0,1);
        Send(0);    
    }
    else{
        for(int i = 1; i < NumberOfNodes(); i++){
            Receive(i);
            ind_x = GetInt(i);
        }
    }
    //2. wyzbacz najwyzszy taki, ze max sie nie zmiesci:
   /* long long min_index = MY_INF;
    
    for(int i = (MyNodeId() + 1); i <= PipeHeight(); i += NumberOfNodes()){
        x = HoleDiameter(i);
        if(x < max_krazkow){
             min_index = i;
             break;     
        }    
    }
    if(MyNodeId() > 0){
        PutInt(0,min_index);
        Send(0);    
    }
    else{
        for(int i = 1; i < NumberOfNodes(); i++){
            Receive(i);
            ind_x = GetInt(i);
            
            min_index = min(min_index, (long long)ind_x);   
        }
    } 
    if(MyNodeId() == 0){
    
        kon = min((min_ind - 1), PipeHeight() - NumberOfDiscs() + 1);
        if(NumberOfDiscs() > PipeHeight()){
            kon = 0;                   
        }
        if((min_ind - 1) < max_krazkow_index){
            kon = 0;
        }
                  
        pocz = 1;
        ost_res = 0;
        
        while(pocz <= kon){
            mid = (pocz + kon) / 2;
            for(int i = 1; i < NumberOfNodes(); i++){
                PutInt(i,mid);
                Send(i);
            }
            zle = 'N';
            for(int i = 1; i < NumberOfNodes(); i++){
            	Receive(i);
            	odp = GetChar(i);
            	if(odp == 'T'){
            		zle = 'T';
            	}
            }
            
            if(zle == 'T'){
            	kon = (mid - 1);
            }
            else{
            	ost_res = mid;
            	pocz = (mid + 1);
            }
        }
        cout << ost_res << endl;
        for(int i = 1; i < NumberOfNodes(); i++){
        	PutInt(i,(-1));
        	Send(i);
        }
    }
    else{
            int ins = Receive(-1);
            poz = GetInt(ins);
            
            if(poz == (-1))return EXIT_SUCCESS;
            
            zle = 'N';
            for(int i = MyNodeId(); i <= NumberOfDiscs(); i+= (NumberOfNodes() - 1)){
                if(DiscDiameter(i) > HoleDiameter(i + poz)){
                    zle = 'T';   
                }
            }
            PutChar(0,zle);
            Send(0);
    }*/
        
    return EXIT_SUCCESS;
}