#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; } } } |
polski