#include <bits/stdc++.h>
using namespace std;
const int N = 5e3 + 1;
const int inff = 1e18 + 1;
int n, q;
unsigned long long seed, b;
int e[N][N], e_[N][N];
int f[N][N], f1[N][N];
int ans;
inline int read() {
int x = 0, f = 1;
char c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();
return x * f;
}
void xorshift64() {
seed ^= seed << 13;
seed ^= seed >> 7;
seed ^= seed << 17;
}
void build() {
for (int i = 1; i <= n; i++) {
for (int j = 1; j < n; j++) {
xorshift64();
e[i][j] = seed & ((1 << b) - 1);
}
}
for (int i = 1; i < n; i++) {
for (int j = 1; j <= n; j++) {
xorshift64();
e_[i][j] = seed & ((1 << b) - 1);
}
}
}
void solve() {
for (int i = 1; i <= n; i++) f[i][0] = f[0][i] = inff;
f[0][1] = 0;
for (int i = 2; i <= n; i++) f[1][i] = f[1][i - 1] + e[1][i - 1];
for (int i = 2; i <= n; i++) f[i][1] = f[i - 1][1] + e_[i - 1][1];
for (int i = 2; i <= n; i++) {
for (int j = 2; j <= n; j++) {
f[i][j] = min(f[i][j - 1] + e[i][j - 1], f[i - 1][j] + e_[i - 1][j]);
}
}
// for (int i = 2; i <= n; i++) {
// for (int j = 2; j <= n; j++) {
// cout << f[i][j] << endl;
// }
for (int i = 1; i <= n; i++) f1[n + 1][i] = f1[i][n + 1] = inff;
f1[n + 1][n] = 0;
// }
for (int i = n - 1; i >= 1; i--) f1[n][i] = f1[n][i + 1] + e[n][i];
for (int i = n - 1; i >= 1; i--) f1[i][n] = f1[i + 1][n] + e_[i][n];
for (int i = n; i >= 1; i--) {
for (int j = n; j >= 1; j--) {
f1[i][j] = min(f1[i][j + 1] + e[i][j], f1[i + 1][j] + e_[i][j]);
}
}
// for (int i = n - 1; i >= 1; i--) {
// for (int j = n - 1; j >= 1; j--) {
// cout << f1[i][j] << endl;
// }
}
signed main() {
ios::sync_with_stdio(0), cin.tie(nullptr), cout.tie(nullptr);
n = read(), q = read();
seed = read(), b = read();
// cin >> seed >> b;
build();
solve();
for (int i = 1; i <= q; i++) {
int x, y, x_, y_;
ans = inff;
x = read(), y = read(), x_ = read(), y_ = read();
// cin >> x >> y >> x_ >> y_;
if (x == x_) {
for (int i = 1; i <= n; i++) {
if (i != x) {
ans = min(ans, f[i][y] + e[i][y] + f1[i][y_]);
}
}
}
if (y == y_) {
for (int i = 1; i <= n; i++) {
if (i != y) {
ans = min(ans, f[x][i] + e_[x][i] + f1[x_][i]);
}
}
}
cout << ans << '\n';
}
return 0;
}
这个代码如何预处理呀(顺便问一下,预处理时什么?