#include<cstdio>
#include<cstdlib>
#include<vector>
#include<algorithm>
#include<math.h>
#include"message.h"
#include"kollib.h"                  //dane startowe

int kolejny(int x){ return SecondNeighbor(x); } //lewy s¹siad x'a

using namespace std;

int main()
{
    int moj_numer = MyNodeId() + 1; //numer komputera, którym jest jam
    int liczba_komp = NumberOfNodes(); //liczba kompóterów
    vector<int>Ti;
    vector<int>Tp;
    int liczba_uczniow = NumberOfStudents(); //liczba uczniow
    int liczba_w_komp = (liczba_uczniow+1) / liczba_komp;
    Ti.resize(liczba_w_komp+1);
    Tp.resize(liczba_w_komp+1);
    int liczba_w_ostatnim = liczba_uczniow % liczba_komp;
    if(liczba_w_ostatnim == 0) liczba_w_ostatnim = liczba_w_komp;
    int ilosc_pytan = NumberOfQueries();
    
    int x=1;
    int a=0;
    
    x=FirstNeighbor(1);
    /*
    if(moj_numer == 1) x=RightNeighbour(1);
    else{
        Receive(moj_numer-1); 
        x = GetInt(moj_numer-1);
    }
    if(moj_numer == liczba_komp)
        liczba_w_ja = liczba_w_ostatnim;
    else
        liczba_w_ja = liczba_w_komp;
    */
    for(int i=1; i<liczba_komp; i++)
        for(int p=1; p<=liczba_w_komp; p++){
            x=kolejny(x);
            int szukany_komp = (x+1) / liczba_w_komp;
            int miejsce = x % liczba_w_komp;
            if(miejsce == 0) miejsce = liczba_w_komp;
            if(moj_numer == szukany_komp){
                Ti[miejsce] = i;
                Tp[miejsce] = p;
            }
        }
    
    for(int p=1; p<=liczba_w_ostatnim; p++){
        x=kolejny(x);
        int szukany_komp = (x+1) / liczba_w_komp;
        int miejsce = x % liczba_w_komp;
        if(miejsce == 0) miejsce = liczba_w_komp;
        if(moj_numer == szukany_komp){
            Ti[miejsce] = liczba_komp;
            Tp[miejsce] = p;
        }
    }
    
    for(int pytanie = 0; pytanie<ilosc_pytan; pytanie++){
        
        int Tijy, Tijz, Tpjy, Tpjz;
        
        int y = QueryFrom(pytanie);
        int z = QueryTo(pytanie);
        int iy = (y+1) / liczba_w_komp;
        int iz = (z+1) / liczba_w_komp;
        int jy = y % liczba_w_komp;
        if(jy == 0) jy = liczba_w_komp;
        int jz = z % liczba_w_komp;
        if(jz == 0) jz = liczba_w_komp;
        
        if(moj_numer == 1){
            if(moj_numer == iy){
                Tijy = Ti[jy];
                Tpjy = Tp[jy];
            }
            else{
                int z_ktorego_y = Receive(-1);
                Tijy = GetInt(z_ktorego_y); //otrzymaj
                Tpjy = GetInt(z_ktorego_y); //otrzymaj
            }
            
            if(moj_numer == iz){
                Tijz = Ti[jz];
                Tpjz = Tp[jz];
            }
            else{
                int z_ktorego_z = Receive(-1);
                Tijz = GetInt(z_ktorego_z); //otrzymaj
                Tpjz = GetInt(z_ktorego_z); //otrzymaj
            }
            printf("%d", min( (abs(Tijy-Tijz)-1)*liczba_w_komp + (abs(Tpjz-Tpjy)+liczba_w_komp-1) , (liczba_komp+abs(Tijy-Tijz)-2)*liczba_w_komp + liczba_w_ostatnim + (liczba_w_komp+abs(Tpjy-Tpjz)-1) ) );
        }
        else{
            if(moj_numer == iy){
                Tijy = Ti[jy];
                PutInt(0, Tijy); //wyslij do 1
                Tpjy = Tp[jy];
                PutInt(0, Tpjy); //wyslij do 1
                Send(0);
            }
            
            if(moj_numer == iz){
                Tijz = Ti[jz];
                PutInt(0, Tijz); //wyslij do 1
                Tpjz = Tp[jz];
                PutInt(0, Tpjz); //wyslij do 1
                Send(0);
            }
        }
    }
    
    system("pause");
    return 0;
}
