Niestety, nie byliśmy w stanie w pełni poprawnie wyświetlić tego pliku, ponieważ nie jest zakodowany w UTF-8. Możesz pobrać ten plik i spróbować otworzyć go samodzielnie.
  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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <algorithm>
#include <iostream>
#include <vector>

#include "krazki.h"
#include "message.h"

using namespace std;



//dopasujace od 0 do n-1
//otwor od dolu
long long int hole(int i, int n){

    return HoleDiameter(    (long long int)   ( n-i  )        );
}
//OD DOLU 0 ->N-1
long long int disc(int i){
    return DiscDiameter((long long int) (i+1) );
}

int main()
{
    int n, m;
    int inst = MyNodeId();
    int all = NumberOfNodes();
    n = PipeHeight();
    m = NumberOfDiscs();

    int a = n* inst/all;
    int b = n* (inst+1) /all;

    int l = b-a;


    vector<long long int> wides;
    wides.resize(l);
    long long int mini = hole(n-1, n);
    for(int i=l-1; i>=0; --i){
        int x = hole(a+i, n);
        if(x<mini) mini = x;
        wides[a+i]=mini;
    }
    long long int gorne_ograniczenie = hole(n-1, n);
    if(inst!=all-1){
         Receive(inst+1);
         gorne_ograniczenie = GetLL(inst+1);
    }
    if(inst!=0){
        PutLL(inst-1, min(gorne_ograniczenie, wides[0]));
        Send(inst-1);
    }
    for(int i=l-1; i>=0; --i){
        if(wides[i]>gorne_ograniczenie) wides[i]=gorne_ograniczenie;
        else break;
    }
    //Zrobilem lejek!!!

    //Teraz czesc glowna


    int uzyte = 0;
    vector<long long int>::iterator najwyzszy=wides.begin();
    long long int * czy_cos_tu = new long long int[l];

    for(int i=a; i<min(b, m); ++i){
        long long int szukana = disc(i);
          vector<long long int>::iterator pozycja = lower_bound(najwyzszy, wides.end(), szukana);
        if(pozycja == wides.end()){
            najwyzszy = pozycja;
            break;
        }
        else{
            najwyzszy = pozycja;
            ++najwyzszy;
            ++uzyte;
            //CO�
        }
    }


    int wchodzi_z_dolu=0;
    if(inst!=0){
        Receive(inst-1);
        wchodzi_z_dolu = GetInt(inst-1);
    }


    int wypychane_do_gory=0;
    int uzyte2=0;
    int gdzie_dopchnal=0;

    if(wchodzi_z_dolu){
        vector<long long int>::iterator najwyzszy2=wides.begin();

        //jesli zaczynam od a i weszlo mi c, to od a-c do a-1


        for(int i=a-wchodzi_z_dolu; i<a; ++i){
            long long int szukana = disc(i);
            vector<long long int>::iterator pozycja = lower_bound(najwyzszy, wides.end(), szukana);
            if(pozycja == wides.end()){
                break;
            }
            else{
                najwyzszy2 = pozycja;
                ++najwyzszy2;
                ++uzyte2;
                //CO�
            }
        }
        gdzie_dopchnal = std::distance(wides.begin(), najwyzszy2);
    }
    int dane_tutaj = max( min(b,m)-a, 0);
    ///uzyte
    wypychane_do_gory = dane_tutaj - uzyte + wchodzi_z_dolu - uzyte2 + max(0, uzyte-(l-gdzie_dopchnal)+1); ///sprawdzic l -gdzie
    ///

    if(inst!=all-1){
        PutInt(inst+1, wypychane_do_gory);
        Send(inst+1);
    }
    else{
        if(wypychane_do_gory) cout << 0;
        else{
            cout << n - max(gdzie_dopchnal, (int)distance(wides.begin(), najwyzszy));
        }
    }


    return 0;
}