| 比赛 |
期末考试4 |
评测结果 |
AAAAAAAAAAAAATTTTTTTTTTTT |
| 题目名称 |
树上查询 |
最终得分 |
52 |
| 用户昵称 |
LikableP |
运行时间 |
64.227 s |
| 代码语言 |
C++ |
内存使用 |
48.82 MiB |
| 提交时间 |
2026-02-12 11:16:06 |
显示代码纯文本
#include <cstdio>
const int MAXN = 1e6 + 10;
struct EDGE {
int v, next;
} edge[MAXN << 1];
int head[MAXN], edgeNum;
void AddEdge(int u, int v) {
edge[++edgeNum] = {v, head[u]};
head[u] = edgeNum;
}
int n, q;
int a[MAXN];
int fa[MAXN];
void dfs(int u, int fa, int dis, long long &ans, int &k) {
if (dis > k) return ;
ans += dis ^ a[u];
for (int i = head[u]; i; i = edge[i].next) {
int v = edge[i].v;
if (v == fa) continue;
dfs(v, u, dis + 1, ans, k);
}
}
int main() {
#ifdef LOCAL
freopen("!input.in", "r", stdin);
freopen("!output.out", "w", stdout);
#else
freopen("tree.in", "r", stdin);
freopen("tree.out", "w", stdout);
#endif
scanf("%d", &n);
for (int i = 1; i <= n; ++i) {
scanf("%d", &a[i]);
}
for (int i = 2; i <= n; ++i) {
scanf("%d", &fa[i]);
AddEdge(fa[i], i);
AddEdge(i, fa[i]);
}
scanf("%d", &q);
while (q--) { int x, k; long long ans = 0;
scanf("%d %d", &x, &k);
dfs(x, fa[x], 0, ans, k);
printf("%lld\n", ans);
}
return 0;
}