#include<cstdio> #include "krazki.h" #include "message.h" long long a, mi[5000003], mini, k, n,m,last, moj,maksi=4000000, d; int main() { n=PipeHeight(); m=NumberOfDiscs(); moj=MyNodeId(); if(moj==0) { d=maksi; if(n<d)d=n; mini=HoleDiameter(1); mi[1]=mini; for(int i=2; i<=d; i++) { a=HoleDiameter(i); if(a<mini)mini=a; mi[i]=mini; } if(n>maksi) { PutLL(moj+1, mini); Send(moj+1); } } else { if(n<=moj*maksi)return 0; Receive(moj-1); mini=GetLL(moj-1); d=maksi*moj; for(int i=1; i<=maksi; i++) { if(i+d<=n)a=HoleDiameter(i+d); if(a<mini)mini=a; mi[i]=mini; } if(n>maksi*(moj+1)) { PutLL(moj+1, mini); Send(moj+1); } } if(n<=maksi*(moj+1)) { last=n; d=1; } else { last=maksi*(moj+1); Receive(moj+1); d = GetLL(moj+1); if(d==0)return 0; } if(moj==0) { while(last>=0&&d<=m) { k=DiscDiameter(d); while(mi[last]<k&&last>=0)last--; last--; if(last<0) { printf("0"); return 0; } d++; } printf("%lld", last+1); return 0; } else { while(last>=maksi*moj&&d<=m) { k=DiscDiameter(d); while(mi[last-maksi*moj]<k&&last>maksi*moj)last--; last--; if(last>=maksi*moj)d++; if(last>=maksi*moj&&d>m) { printf("%lld", last+1); d=0; break; } } PutLL(moj-1, d); Send(moj-1); return 0; } }
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 | #include<cstdio> #include "krazki.h" #include "message.h" long long a, mi[5000003], mini, k, n,m,last, moj,maksi=4000000, d; int main() { n=PipeHeight(); m=NumberOfDiscs(); moj=MyNodeId(); if(moj==0) { d=maksi; if(n<d)d=n; mini=HoleDiameter(1); mi[1]=mini; for(int i=2; i<=d; i++) { a=HoleDiameter(i); if(a<mini)mini=a; mi[i]=mini; } if(n>maksi) { PutLL(moj+1, mini); Send(moj+1); } } else { if(n<=moj*maksi)return 0; Receive(moj-1); mini=GetLL(moj-1); d=maksi*moj; for(int i=1; i<=maksi; i++) { if(i+d<=n)a=HoleDiameter(i+d); if(a<mini)mini=a; mi[i]=mini; } if(n>maksi*(moj+1)) { PutLL(moj+1, mini); Send(moj+1); } } if(n<=maksi*(moj+1)) { last=n; d=1; } else { last=maksi*(moj+1); Receive(moj+1); d = GetLL(moj+1); if(d==0)return 0; } if(moj==0) { while(last>=0&&d<=m) { k=DiscDiameter(d); while(mi[last]<k&&last>=0)last--; last--; if(last<0) { printf("0"); return 0; } d++; } printf("%lld", last+1); return 0; } else { while(last>=maksi*moj&&d<=m) { k=DiscDiameter(d); while(mi[last-maksi*moj]<k&&last>maksi*moj)last--; last--; if(last>=maksi*moj)d++; if(last>=maksi*moj&&d>m) { printf("%lld", last+1); d=0; break; } } PutLL(moj-1, d); Send(moj-1); return 0; } } |