#include "krazki.h"
#include "message.h"
#include <algorithm>
#include <cstdio>
#define LL long long
using namespace std;
LL tab[1100];
LL tabmin[1100];
LL holes[4000010];
LL val[4000010];
const LL INF = 2000000000000000000LL;
int main()
{
int S = 200000000 / NumberOfNodes() + 1;
int node = MyNodeId();
int n = PipeHeight();
int N = (n - 1) / S + 2;
int r = NumberOfDiscs();
if (node == 0)
{
tabmin[0] = INF;
for (int i = 1; i < N; i++)
{
Receive(i);
tab[i] = GetLL(i);
tabmin[i] = min(tabmin[i - 1], tab[i]);
}
for (int i = 1; i < N; i++)
{
PutLL(i, tabmin[i - 1]);
Send(i);
}
Receive(1);
GetLL(1);
GetLL(1);
LL out = GetLL(1);
printf("%lld\n", out);
}
else
{
if (node < N)
{
int pocz = (node - 1) * S + 1;
int kon = min(n, node * S);
for (int i = pocz; i <= kon; i++)
{
holes[i - pocz + 1] = HoleDiameter(i);
}
val[0] = INF;
for (int i = pocz; i <= kon; i++)
{
val[i - pocz + 1] = min(val[i - pocz], holes[i - pocz + 1]);
}
PutLL(0, val[kon - pocz + 1]);
Send(0);
Receive(0);
LL curval = GetLL(0);
LL krid;
LL krsize;
LL out;
if (node == N - 1)
{
krid = 1;
krsize = DiscDiameter(1);
out = 0;
}
else
{
Receive(node + 1);
krid = GetLL(node + 1);
krsize = GetLL(node + 1);
out = GetLL(node + 1);
}
if (out == 0)
{
for (int i = kon; i >= pocz; i--)
{
if (krsize > curval)
i = pocz - 1;
else
{
if (krsize <= min(curval, val[i - pocz + 1]))
if (krid < r)
{
krid++;
krsize = DiscDiameter(krid);
}
else out = i, i = pocz - 1;
}
}
}
PutLL(node - 1, krid);
PutLL(node - 1, krsize);
PutLL(node - 1, out);
Send(node - 1);
}
}
}
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 | #include "krazki.h" #include "message.h" #include <algorithm> #include <cstdio> #define LL long long using namespace std; LL tab[1100]; LL tabmin[1100]; LL holes[4000010]; LL val[4000010]; const LL INF = 2000000000000000000LL; int main() { int S = 200000000 / NumberOfNodes() + 1; int node = MyNodeId(); int n = PipeHeight(); int N = (n - 1) / S + 2; int r = NumberOfDiscs(); if (node == 0) { tabmin[0] = INF; for (int i = 1; i < N; i++) { Receive(i); tab[i] = GetLL(i); tabmin[i] = min(tabmin[i - 1], tab[i]); } for (int i = 1; i < N; i++) { PutLL(i, tabmin[i - 1]); Send(i); } Receive(1); GetLL(1); GetLL(1); LL out = GetLL(1); printf("%lld\n", out); } else { if (node < N) { int pocz = (node - 1) * S + 1; int kon = min(n, node * S); for (int i = pocz; i <= kon; i++) { holes[i - pocz + 1] = HoleDiameter(i); } val[0] = INF; for (int i = pocz; i <= kon; i++) { val[i - pocz + 1] = min(val[i - pocz], holes[i - pocz + 1]); } PutLL(0, val[kon - pocz + 1]); Send(0); Receive(0); LL curval = GetLL(0); LL krid; LL krsize; LL out; if (node == N - 1) { krid = 1; krsize = DiscDiameter(1); out = 0; } else { Receive(node + 1); krid = GetLL(node + 1); krsize = GetLL(node + 1); out = GetLL(node + 1); } if (out == 0) { for (int i = kon; i >= pocz; i--) { if (krsize > curval) i = pocz - 1; else { if (krsize <= min(curval, val[i - pocz + 1])) if (krid < r) { krid++; krsize = DiscDiameter(krid); } else out = i, i = pocz - 1; } } } PutLL(node - 1, krid); PutLL(node - 1, krsize); PutLL(node - 1, out); Send(node - 1); } } } |
English