#include <iostream> #include <kollib.h> #include <message.h> #include <cmath> #define li long int using namespace std; int main(){ li first,last,n,N,ile; int node=MyNodeId(); N=NumberOfNodes(); n=NumberOfStudents(); first=1+node*(n/N); if(node==N-1)last=n; else last=first+n/N-1; ile=last-first+1; li**distance=new li*[ile]; li queries = NumberOfQueries(); for(li i=0; i<ile;i++){ li index=first+i; if(index>n)return 0; distance[i]=new li[n+1]; distance[i][index]=0; li prev=i; li cur=FirstNeighbor(index); //pierwszy kierunek li temp; li k=1; li t=n/2; while(k<=t){ distance[i][cur]=k++; temp=FirstNeighbor(cur); if(temp!=prev){ prev=cur; cur=temp; } else { prev=cur; cur=SecondNeighbor(cur); } } //pierwsze przejscie prev=i; cur=SecondNeighbor(index); //drugi kierunek k=1; t=n/2; while(k<=t){ distance[i][cur]=k++; temp=FirstNeighbor(cur); if(temp!=prev){ prev=cur; cur=temp; } else { prev=cur; cur=SecondNeighbor(cur); } } //drugie przejscie } for(li i=1;i<=queries;i++){ li from=QueryFrom(i); if(from>=first && from <= last){ PutInt(0,distance[from-first][QueryTo(i)]); Send(0); } } if(node==0){ ios_base::sync_with_stdio(0); for(li i=1;i<=queries;i++){ li from=QueryFrom(i); li k=(from-1)/(n/N); Receive(k); cout << GetInt(k) << endl; } } }
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 | #include <iostream> #include <kollib.h> #include <message.h> #include <cmath> #define li long int using namespace std; int main(){ li first,last,n,N,ile; int node=MyNodeId(); N=NumberOfNodes(); n=NumberOfStudents(); first=1+node*(n/N); if(node==N-1)last=n; else last=first+n/N-1; ile=last-first+1; li**distance=new li*[ile]; li queries = NumberOfQueries(); for(li i=0; i<ile;i++){ li index=first+i; if(index>n)return 0; distance[i]=new li[n+1]; distance[i][index]=0; li prev=i; li cur=FirstNeighbor(index); //pierwszy kierunek li temp; li k=1; li t=n/2; while(k<=t){ distance[i][cur]=k++; temp=FirstNeighbor(cur); if(temp!=prev){ prev=cur; cur=temp; } else { prev=cur; cur=SecondNeighbor(cur); } } //pierwsze przejscie prev=i; cur=SecondNeighbor(index); //drugi kierunek k=1; t=n/2; while(k<=t){ distance[i][cur]=k++; temp=FirstNeighbor(cur); if(temp!=prev){ prev=cur; cur=temp; } else { prev=cur; cur=SecondNeighbor(cur); } } //drugie przejscie } for(li i=1;i<=queries;i++){ li from=QueryFrom(i); if(from>=first && from <= last){ PutInt(0,distance[from-first][QueryTo(i)]); Send(0); } } if(node==0){ ios_base::sync_with_stdio(0); for(li i=1;i<=queries;i++){ li from=QueryFrom(i); li k=(from-1)/(n/N); Receive(k); cout << GetInt(k) << endl; } } } |