#include <iostream> #include "message.h" #include "kollib.h" #include <vector> #include <cstdlib> #include <cstdio> using namespace std; void wykonaj() { vector<int> queryFroms; vector<int> queryTos; int n = NumberOfStudents(), k = NumberOfQueries(); for (int i = MyNodeId(); i < k; i += NumberOfNodes()) { queryFroms.push_back(QueryFrom(i + 1)); queryTos.push_back(QueryTo(i + 1)); } int wyniki1[queryFroms.size()]; int wyniki2[queryTos.size()]; int poprzedni = SecondNeighbor(1); int cur = 1, tmp; int ktory = 0; do { for (int i = 0; i < queryFroms.size(); i++) { if (cur == queryFroms[i]) { wyniki1[i] = ktory; } } for (int i = 0; i < queryTos.size(); i++) { if (cur == queryTos[i]) { wyniki2[i] = ktory; } } ktory++; tmp = cur; if (SecondNeighbor(cur) == poprzedni) { cur = FirstNeighbor(cur); } else cur = SecondNeighbor(cur); poprzedni = tmp; } while (cur != 1); int tmpWynik; int index = 0; for (int i = MyNodeId(); i < k; i += NumberOfNodes()) { tmpWynik = wyniki1[index] - wyniki2[index]; tmpWynik = tmpWynik > 0 ? tmpWynik : -tmpWynik; PutInt(0, (tmpWynik < (n - tmpWynik) ? tmpWynik : n - tmpWynik)); index++; } Send(0); } int main() { int numer = MyNodeId(); wykonaj(); int k = NumberOfQueries(); if (numer == 0) { int wyniki[k]; for (int i = 0; i < NumberOfNodes(); i++) { for (int j = i; j < k; j += NumberOfNodes()) { if (j == i) Receive(i); wyniki[j] = GetInt(i); } } for (int i = 0; i < k; i++) { printf("%d\n", wyniki[i]); } } 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 | #include <iostream> #include "message.h" #include "kollib.h" #include <vector> #include <cstdlib> #include <cstdio> using namespace std; void wykonaj() { vector<int> queryFroms; vector<int> queryTos; int n = NumberOfStudents(), k = NumberOfQueries(); for (int i = MyNodeId(); i < k; i += NumberOfNodes()) { queryFroms.push_back(QueryFrom(i + 1)); queryTos.push_back(QueryTo(i + 1)); } int wyniki1[queryFroms.size()]; int wyniki2[queryTos.size()]; int poprzedni = SecondNeighbor(1); int cur = 1, tmp; int ktory = 0; do { for (int i = 0; i < queryFroms.size(); i++) { if (cur == queryFroms[i]) { wyniki1[i] = ktory; } } for (int i = 0; i < queryTos.size(); i++) { if (cur == queryTos[i]) { wyniki2[i] = ktory; } } ktory++; tmp = cur; if (SecondNeighbor(cur) == poprzedni) { cur = FirstNeighbor(cur); } else cur = SecondNeighbor(cur); poprzedni = tmp; } while (cur != 1); int tmpWynik; int index = 0; for (int i = MyNodeId(); i < k; i += NumberOfNodes()) { tmpWynik = wyniki1[index] - wyniki2[index]; tmpWynik = tmpWynik > 0 ? tmpWynik : -tmpWynik; PutInt(0, (tmpWynik < (n - tmpWynik) ? tmpWynik : n - tmpWynik)); index++; } Send(0); } int main() { int numer = MyNodeId(); wykonaj(); int k = NumberOfQueries(); if (numer == 0) { int wyniki[k]; for (int i = 0; i < NumberOfNodes(); i++) { for (int j = i; j < k; j += NumberOfNodes()) { if (j == i) Receive(i); wyniki[j] = GetInt(i); } } for (int i = 0; i < k; i++) { printf("%d\n", wyniki[i]); } } return 0; } |