#include <bits/stdc++.h>
#define int long long
using namespace std;
using pii = pair<int, int>;
using t3i = tuple<int, int, int>;
void dfs(int v, vector<vector<int>> &ch, vector<int> &order) {
order.push_back(v);
for (int u : ch[v]) dfs(u, ch, order);
}
signed main() {
int n, k, _, q;
cin >> n >> k >> _ >> q;
vector<int> p1(n);
int root1;
for (int i = 0; i < n; i++) {
cin >> p1[i];
p1[i]--;
if (p1[i] == -2) root1 = i;
}
vector<int> p2(n);
int root2;
for (int i = 0; i < n; i++) {
cin >> p2[i];
p2[i]--;
if (p2[i] == -2) root2 = i;
}
vector<vector<int>> ch1(n);
for (int i = 0; i < n; i++) {
if (i != root1) ch1[p1[i]].push_back(i);
}
vector<vector<int>> ch2(n);
for (int i = 0; i < n; i++) {
if (i != root2) ch2[p2[i]].push_back(i);
}
for (int i = 0; i < k; i++) {
cout << (root1 + i) % n + 1 << " ";
}
cout << endl;
vector<int> dr(n);
for (int i = 0; i < k - 1; i++) {
cout << "? " << (root1 + i + 1) % n + 1 << " " << root1 + 1 << "\n";
}
cout << "!" << endl;
for (int i = 0; i < k - 1; i++) {
int d1a, d1b, d2a, d2b;
cin >> d1a >> d1b >> d2a >> d2b;
dr[(root1 + i + 1) % n] = d1a + d1b;
}
while (q--) {
int u, v;
cin >> u >> v;
u--; v--;
if (u == v) {
cout << "0 0" << "\n";
} else if (u == root1) {
cout << dr[v] << " " << dr[v] << "\n";
} else if (v == root1) {
cout << dr[u] << " " << dr[u] << "\n";
} else {
cout << dr[v] + dr[u] << " " << dr[v] + dr[u] << "\n";
}
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |