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
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
#include <iostream>
#include <cstdio>
#include <map>
#include <set>
#include <algorithm>
#include "message.h"
#include "kollib.h"
using namespace std;

int pocz, kon;
int popl;
int popp;
int jl;
int jp;

int n, m;
int k;
map <int,int> widziane;
map <int,int> szukane;
int aktu;
int pop;
int num1;
int num2;
int wia;

int main()
{
	if (NumberOfStudents()<=10000003)
	{
		if (MyNodeId())
		return 0;
		n=NumberOfStudents();
		m=NumberOfQueries();
		for (int i=1; i<=m; i++)
		{
			szukane[QueryFrom(i)]++;
			szukane[QueryTo(i)]++;
		}
		jl=1;
		popl=0;
		for (int i=1; i<=n; i++)
		{
			if (szukane.count(jl))
			{
				widziane[jl]=i;
			}
			if (FirstNeighbor(jl)==popl)
			{
				popl=jl;
				jl=SecondNeighbor(jl);
			}
			else
			{
				popl=jl;
				jl=FirstNeighbor(jl);
			}
		}
		for (int i=1; i<=m; i++)
		{
			num1=widziane[QueryFrom(i)];
			num2=widziane[QueryTo(i)];
			printf("%d\n", min(max(num1, num2)-min(num1, num2), n-max(num1, num2)+min(num1, num2)));
		}
		return 0;
	}
	n=NumberOfStudents();
	m=NumberOfQueries();
	k=n/NumberOfNodes();
	if (MyNodeId()==NumberOfNodes()-1)
	k+=(n%NumberOfNodes());
	for (int i=1; i<=m; i++)
	{
		szukane[QueryFrom(i)]++;
		szukane[QueryTo(i)]++;
	}
	aktu=1;
	pop=0;
	for (int i=1; i<=(MyNodeId()*(n/NumberOfNodes()))+k; i++)
	{
		if (i>(MyNodeId()*(n/NumberOfNodes())) && szukane.count(aktu))
		{
			widziane[aktu]=i;
		}
		if (FirstNeighbor(aktu)==pop)
		{
			pop=aktu;
			aktu=SecondNeighbor(aktu);
		}
		else
		{
			pop=aktu;
			aktu=FirstNeighbor(aktu);
		}
	}
	for (int i=1; i<=m; i++)
	{
		if (MyNodeId())
		{
			PutInt(0, widziane[QueryFrom(i)]);
			PutInt(0, widziane[QueryTo(i)]);
			Send(0);
		}
		else
		{
			num1=widziane[QueryFrom(i)];
			num2=widziane[QueryTo(i)];
			for (int j=1; j<NumberOfNodes(); j++)
			{
				Receive(j);
				wia=GetInt(j);
				if (wia)
				{
					num1=wia;
				}
				wia=GetInt(j);
				if (wia)
				{
					num2=wia;
				}
			}
			printf("%d\n", min(max(num1-num2, num2-num1), n-max(num1, num2)+min(num1, num2)));
		}
	}
	return 0;
}