#include <stdio.h> #include <stdlib.h> #include "kollib.h" #include "message.h" int t[10000100],s[10000100]; int o(const void *a, const void *b) { return t[*(int*)a]-t[*(int*)b]; } int main() { int n,m,i,j,p,q,a,b,c,d,*v,x,y; n=NumberOfStudents(); m=NumberOfNodes(); i=MyNodeId(); if (m>n && i>0) return 0; if (m>n) p=0, q=n; else { p=n/m*i; q=i+1<m?n/m*(i+1):n; } if (p>0) { Receive(i-1); a=GetInt(i-1); b=GetInt(i-1); } else a=b=0; for (x=p;x<q;x++) { t[x-p]=a; s[x-p]=x-p; c=FirstNeighbor(a+1)-1; if (c==b) c=SecondNeighbor(a+1)-1; b=a, a=c; } if (q<n) { PutInt(i+1,a); PutInt(i+1,b); Send(i+1); } qsort(s,q-p,sizeof(*s),o); a=NumberOfQueries(); for (b=0;b<a;b++) { c=QueryFrom(b+1)-1; v=(int*)bsearch(&c,s,q-p,sizeof(*s),o); PutInt(0,v?*v+p:-1); c=QueryTo(b+1)-1; v=(int*)bsearch(&c,s,q-p,sizeof(*s),o); PutInt(0,v?*v+p:-1); Send(0); if (i==0) { x=y=-1; for (j=0;j<(m>n?1:m);j++) { Receive(j); c=GetInt(j); c>=0?x=c:0; c=GetInt(j); c>=0?y=c:0; } c=(n+x-y)%n; d=(n+y-x)%n; printf("%d\n",c<d?c:d); } } 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 | #include <stdio.h> #include <stdlib.h> #include "kollib.h" #include "message.h" int t[10000100],s[10000100]; int o(const void *a, const void *b) { return t[*(int*)a]-t[*(int*)b]; } int main() { int n,m,i,j,p,q,a,b,c,d,*v,x,y; n=NumberOfStudents(); m=NumberOfNodes(); i=MyNodeId(); if (m>n && i>0) return 0; if (m>n) p=0, q=n; else { p=n/m*i; q=i+1<m?n/m*(i+1):n; } if (p>0) { Receive(i-1); a=GetInt(i-1); b=GetInt(i-1); } else a=b=0; for (x=p;x<q;x++) { t[x-p]=a; s[x-p]=x-p; c=FirstNeighbor(a+1)-1; if (c==b) c=SecondNeighbor(a+1)-1; b=a, a=c; } if (q<n) { PutInt(i+1,a); PutInt(i+1,b); Send(i+1); } qsort(s,q-p,sizeof(*s),o); a=NumberOfQueries(); for (b=0;b<a;b++) { c=QueryFrom(b+1)-1; v=(int*)bsearch(&c,s,q-p,sizeof(*s),o); PutInt(0,v?*v+p:-1); c=QueryTo(b+1)-1; v=(int*)bsearch(&c,s,q-p,sizeof(*s),o); PutInt(0,v?*v+p:-1); Send(0); if (i==0) { x=y=-1; for (j=0;j<(m>n?1:m);j++) { Receive(j); c=GetInt(j); c>=0?x=c:0; c=GetInt(j); c>=0?y=c:0; } c=(n+x-y)%n; d=(n+y-x)%n; printf("%d\n",c<d?c:d); } } return 0; } |