比赛 期末考试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;
}