5~8 11~16AC 其他WA
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
#include <stdlib.h>
#include <time.h>
#include <map>
#include <complex>
#include <math.h>
#include <stack>
#include <unordered_map>
#include <set>
#include <string.h>
using namespace std;
#define int long long
int fa[50010];
vector<int> s[50010];
int siz[50010], hs[50010], tp[50010], dfn[50010], dcnt, dep[50010];
void dfs1(int u) {
siz[u] = 1;
dep[u] = dep[fa[u]] + 1;
for (int i = 0; i < s[u].size(); i++) {
dfs1(s[u][i]);
siz[u] += siz[s[u][i]];
if (siz[s[u][i]] > siz[hs[u]])hs[u] = s[u][i];
}
}
void dfs2(int t, int u) {
tp[u] = t;
dfn[u] = ++dcnt;
if (hs[u]) {
dfs2(t, hs[u]);
for (int i = 0; i < s[u].size(); i++)if (s[u][i] != hs[u])dfs2(s[u][i], s[u][i]);
}
}
int mp[50010], mf[50010];
#define P 998244353
int qp(int a, int b) {
int ans = 1;
while (b) {
if (b % 2)ans = ans * a % P;
a = a * a % P;
b /= 2;
}
return ans;
}
int m(int i) {
return (i % P + P) % P;
}
int st[200010], tg[200010];
void pdn(int i, int l, int r) {
if (l < r) {
tg[2 * i] = m(tg[2 * i] + tg[i]);
st[2 * i] = m(st[2 * i] + (mf[(l + r) / 2] - mf[l - 1]) * tg[i]);
tg[2 * i + 1] = m(tg[2 * i + 1] + tg[i]);
st[2 * i + 1] = m(st[2 * i + 1] + (mf[r] - mf[(l + r) / 2]) * tg[i]);
}
tg[i] = 0;
}
void pup(int i, int l, int r) {
if (l < r)st[i] = m(st[2 * i] + st[2 * i + 1]);
}
void mdf(int i, int l, int r, int L, int R, int v) {
if (L <= l && r <= R) {
tg[i] = m(tg[i] + v);
st[i] = m(st[i] + (mf[r] - mf[l - 1]) * v);
return;
}
pdn(i, l, r);
if (max(l, L) <= min((l + r) / 2, R))mdf(2 * i, l, (l + r) / 2, L, R, v);
if (max((l + r) / 2 + 1, L) <= min(r, R))mdf(2 * i + 1, (l + r) / 2 + 1, r, L, R, v);
pup(i, l, r);
}
int qry(int i, int l, int r, int L, int R) {
int ans = 0;
if (L <= l && r <= R)return st[i];
pdn(i, l, r);
if (max(l, L) <= min((l + r) / 2, R))ans = m(ans + qry(2 * i, l, (l + r) / 2, L, R));
if (max((l + r) / 2 + 1, L) <= min(r, R))ans = m(ans + qry(2 * i + 1, (l + r) / 2 + 1, r, L, R));
return ans;
}
int qa[50010], qb[50010], qn[50010];
vector<int> qs[50010];
signed main() {
ios::sync_with_stdio(0);
int n, q, k;
cin >> n >> q >> k;
for (int i = 2; i <= n; i++) {
int k;
cin >> k;
fa[i] = k;
s[k].push_back(i);
}
dfs1(1);
dfs2(1, 1);
for (int i = 1; i <= n; i++)mp[dfn[i]] = m(qp(dep[i], k) - qp(dep[i] - 1, k));
for (int i = 1; i <= n; i++)mf[i] = m(mf[i - 1] + mp[i]);
for (int i = 1; i <= q; i++) {
cin >> qa[i] >> qb[i];
qs[qa[i]].push_back(i);
}
for (int i = 1; i <= n; i++) {
int y = i;
while (y != 0) {
mdf(1, 1, n, dfn[tp[y]], dfn[y], 1);
y = fa[tp[y]];
}
for (int t = 0; t < qs[i].size(); t++) {
y = qb[qs[i][t]];
while (y != 0) {
qn[qs[i][t]] = (qn[qs[i][t]] + qry(1, 1, n, dfn[tp[y]], dfn[y]));
y = fa[tp[y]];
}
}
}
for (int i = 1; i <= q; i++)cout << qn[i] << endl;
return 0;
}