Language: C++

#include <iostream>
#include <iomanip>
#include <random>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <cmath>
#include <numeric>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <sstream>
#include <bitset>
#include <cassert>
#include <fstream>
#include <queue>

#define len(X) ((int)(X).size())

#ifdef __LOCAL
	#define DBG(X) cout << #X << "=" << (X) << '\n';
	#define SAY(X) cout << (X) << '\n';
#else
	#define DBG(X)
	#define SAY(X)
#endif
 
using namespace std;

using ll = long long int;
using ull = unsigned long long int;
using ld  = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int INT_INF = (int)(2e9);
const ll  LL_INF  = (ll)(2e18);

const int NIL = -1;
static mt19937 _g(time(nullptr));

inline ll randint(ll a, ll b) { ll w = (_g() << 31LL) ^ _g(); return a + w % (b - a + 1); }
inline void fast_io() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); };
template<typename T> inline T sign(T x) { return T(x > 0) - T(x < 0); }
template<typename T, typename S> inline ostream& operator<<(ostream& os, const pair<T, S> p) { cout << "[" << p.first << ";" << p.second << "]"; return os; }
template<typename T> inline ostream& operator<<(ostream& os, const vector<T>& v) { for(auto el: v) cout << el << " "; return os; }
template<typename T> inline T fetch() { T ret; cin >> ret; return ret; }
template<typename T> inline vector<T> fetch_vec(int sz) { vector<T> ret(sz); for(auto& elem: ret) cin >> elem; return ret; }

const int MAXN = 307 * 307;

int H, W, D;
int X[MAXN], Y[MAXN];

int pref[MAXN][MAXN];
int sz[MAXN];

void solve() {
	cin >> H >> W >> D;

	for(int i = 0; i < H; ++i) {
		for(int j = 0; j < W; ++j) {
			int val = fetch<int>() - 1;

			X[val] = i;
			Y[val] = j;
		}
	}

	for(int rem = 0; rem < D; ++rem) {
		sz[rem] = 1;

		for(int i = rem; i < H * W; i += D) {
			int j = (i - rem) / D;

			if(j == 0) {
				continue;
			}

			pref[rem][j] = pref[rem][j - 1] + abs(X[i] - X[i - D]) + abs(Y[i] - Y[i - D]);
			++sz[rem];
		}

#ifdef __LOCAL
		cout << "@rem=" << rem << '\n';
		cout << "@pref=";

		for(int i = 0; i < sz[rem]; ++i) {
			cout << pref[rem][i] << ' ';
		}

		cout << '\n';
#endif
	}

	int q = fetch<int>();

	while(q--) {
		int L = fetch<int>() - 1;
		int R = fetch<int>() - 1;

		int rem = L % D;
		L -= rem, R -= rem;
		L /= D, R /= D;

		if(L <= R) {
			cout << pref[rem][R] - pref[rem][L] << '\n';
		} else {
			cout << pref[rem][sz[rem] - 1] - pref[rem][R] + pref[rem][L] << '\n';
		}
	}
}

int main() {
	fast_io();
	solve();

	return 0;
}


Compiler output:
/tmp/ccw1ZeFk.o: in function `solve()':
a.cc:(.text+0xd6): relocation truncated to fit: R_X86_64_PC32 against symbol `sz' defined in .bss section in /tmp/ccw1ZeFk.o
a.cc:(.text+0x1f3): relocation truncated to fit: R_X86_64_PC32 against symbol `sz' defined in .bss section in /tmp/ccw1ZeFk.o
a.cc:(.text+0x20d): relocation truncated to fit: R_X86_64_PC32 against symbol `sz' defined in .bss section in /tmp/ccw1ZeFk.o
a.cc:(.text+0x333): relocation truncated to fit: R_X86_64_PC32 against symbol `sz' defined in .bss section in /tmp/ccw1ZeFk.o
/tmp/ccw1ZeFk.o: in function `__static_initialization_and_destruction_0()':
a.cc:(.text+0x416): relocation truncated to fit: R_X86_64_PC32 against `.bss'
collect2: error: ld returned 1 exit status