#include <stdio.h>
#include <algorithm>
#define N 1000000
int n, k, q, t, p[N], dfn[N], dfc, nfd[N], fa[N], hd[N], e[N * 2]
, Ln[N * 2], ii, rt, hld[N], lv[N], dis[N], sz[N]
, hd2[N], e2[N * 2], Ln2[N * 2], ii2, dfn2[N], dfc2, fa2[N]
, hld2[N], lv2[N], sz2[N], V[N + N], tp, dis2[N], sta[N]
, e3[N * 2], Ln3[N * 2], ii3, hd3[N], dis3[N], cst[N * 2], lv3[N]
, dfn3[N], dfc3, sz3[N], hld3[N], fa3[N]
;
int cmp(int i, int j) {
return dfn2[i] < dfn2[j];
}
void add(int u, int v) {
++ii;
e[ii] = v, Ln[ii] = hd[u];
hd[u] = ii;
}
void add2(int u, int v) {
++ii2;
e2[ii2] = v, Ln2[ii2] = hd2[u];
hd2[u] = ii2;
}
void add3(int u, int v, int w) {
++ii3;
cst[ii3] = w;
e3[ii3] = v, Ln3[ii3] = hd3[u];
hd3[u] = ii3;
}
void dfs(int u) {
sz[u] = 1;
for (int v, j = hd[u]; j; j = Ln[j]) {
v = e[j];
lv[v] = lv[u] + 1;
dfs(v);
sz[u] += sz[v];
if (sz[v] > sz[e[hd[u]]]) e[j] = e[hd[u]], e[hd[u]] = v;
}
}
void dfs2(int u) {
nfd[dfn[u] = dfc++] = u;
for (int v, j = hd[u]; j; j = Ln[j]) {
v = e[j];
hld[v] = j == hd[u] ? hld[u]: v;
dfs2(v);
}
}
void efs(int u) {
sz2[u] = 1;
for (int v, j = hd2[u]; j; j = Ln2[j]) {
v = e2[j];
lv2[v] = lv2[u] + 1;
efs(v);
sz2[u] += sz2[v];
if (sz2[v] > sz2[e2[hd2[u]]]) e2[j] = e2[hd2[u]], e2[hd2[u]] = v;
}
}
void efs2(int u) {
dfn2[u] = dfc2++;
for (int v, j = hd2[u]; j; j = Ln2[j]) {
v = e2[j];
hld2[v] = j == hd2[u] ? hld2[u]: v;
dfs2(v);
}
}
void gfs(int u) {
sz3[u] = 1;
for (int v, j = hd3[u]; j; j = Ln3[j]) {
v = e3[j];
lv3[v] = lv3[u] + cst[j];
fa3[v] = u;
gfs(v);
sz3[u] += sz3[v];
if (sz3[v] > sz3[e3[hd3[u]]]) e3[j] = e3[hd3[u]], e3[hd3[u]] = v;
}
}
void gfs2(int u) {
dfn3[u] = dfc3++;
for (int v, j = hd3[u]; j; j = Ln3[j]) {
v = e3[j];
hld3[v] = j == hd3[u] ? hld3[u]: v;
gfs2(v);
}
}
int lca(int u, int v) {
while (hld[u] != hld[v]) {
if (lv[hld[u]] > lv[hld[v]]) u = fa[hld[u]];
else v = fa[hld[v]];
}
return dfn[u] < dfn[v] ? u: v;
}
int lca2(int u, int v) {
while (hld2[u] != hld2[v]) {
if (lv2[hld2[u]] > lv2[hld2[v]]) u = fa2[hld2[u]];
else v = fa2[hld2[v]];
}
return dfn2[u] < dfn2[v] ? u: v;
}
int lca3(int u, int v) {
while (hld3[u] != hld3[v]) {
if (lv3[hld3[u]] > lv3[hld3[v]]) u = fa3[hld3[u]];
else v = fa3[hld3[v]];
}
return dfn3[u] < dfn3[v] ? u: v;
}
int main() {
scanf("%d%d%d%d", &n, &k, &q, &t);
for (int i = 0; i < n; ++i) {
scanf("%d", &fa[i]);
if (fa[i] == -1)
rt = i;
else
add(--fa[i], i);
}
for (int i = 0; i < n; ++i) {
scanf("%d", &fa2[i]);
if (fa2[i] > -1)
add2(--fa2[i], i);
}
fa[rt] = rt; hld[rt] = rt;
fa2[rt] = rt; hld2[rt] = rt;
fa3[rt] = rt; hld3[rt] = rt;
dfs(rt);
dfs2(rt);
efs(rt);
efs2(rt);
for (int i = 0; i < k; ++i)
printf("%d ", 1 + nfd[i]);
puts("");
fflush(stdout);
for (int i = 1; i <= q; ++i)
printf("? %d %d\n", 1 + rt, 1 + nfd[i]);
V[tp++] = rt;
for (int i = 1; i <= q; ++i)
V[tp++] = nfd[i];
std::sort(V, V + tp, cmp);
for (int i = 1; i < tp; ++i) {
V[tp++] = lca2(V[i - 1], V[i]);
printf("? %d %d\n", V[i - 1], V[i]);
}
puts("!");
fflush(stdout);
for (int i = 1; i <= q; ++i)
scanf("%*d%d%*d%d\n", dis + nfd[i], dis2 + nfd[i]);
for (int i = 1; i < tp; ++i) {
int d1, d2;
scanf("%*d%*d%d%d\n", &d1, &d2);
int ca = lca2(V[i - 1], V[i]);
dis2[ca] = dis2[V[i]] - d2;
}
/* build virtual tree */
for (int oldtp = tp, i = 1; i < oldtp; ++i)
V[tp++] = lca2(V[i - 1], V[i]);
std::sort(V, V + tp, cmp);
tp = std::unique(V, V + tp) - V;
sta[++tp] = V[0];
for (int i = 1; i < n; ++i) {
while (! (dfn2[sta[tp]] <= dfn2[V[i]] &&
dfn2[V[i]] + sz2[V[i]] <= dfn2[sta[tp]] + sz2[sta[tp]])
)
--tp;
add3(sta[tp], V[i], dis2[V[i]] - dis2[sta[tp]]);
}
gfs(rt);
gfs2(rt);
static int q1[N], q2[N];
for (int i = 0; i < t; ++i)
scanf("%d%d", &q1[i], &q2[i]);
for (int i = 0; i < t; ++i) {
int u, v, x, y;
u = q1[i] - 1, v = q2[i] - 1;
x = dis[u] + dis[v] - 2 * dis[lca(u, v)];
y = lv3[u] + lv3[v] - 2 * lv3[lca3(u, v)];
printf("%d %d\n", x, y);
}
fflush(stdout);
return 0;
}
컴파일 시 표준 에러 (stderr) 메시지
Main.cpp: In function 'int main()':
Main.cpp:125:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
125 | scanf("%d%d%d%d", &n, &k, &q, &t);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:128:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
128 | scanf("%d", &fa[i]);
| ~~~~~^~~~~~~~~~~~~~
Main.cpp:136:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
136 | scanf("%d", &fa2[i]);
| ~~~~~^~~~~~~~~~~~~~~
Main.cpp:170:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
170 | scanf("%*d%d%*d%d\n", dis + nfd[i], dis2 + nfd[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:173:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
173 | scanf("%*d%*d%d%d\n", &d1, &d2);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~
Main.cpp:200:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
200 | scanf("%d%d", &q1[i], &q2[i]);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
# | 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... |