RT,只有 #11#12 能过,实在不知道挂哪里了/kk
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
int xr=0,F=1;char cr=getchar();
while(cr<'0'||cr>'9') {if(cr=='-') F=-1;cr=getchar();}
while(cr>='0'&&cr<='9')
xr=(xr<<3)+(xr<<1)+(cr^48),cr=getchar();
return xr*F;
}
#define pii pair<int,int>
#define fi first
#define se second
#define ls (now<<1)
#define rs (now<<1|1)
#define mid ((l+r)>>1)
const int N=5e4+5;
const int mod=998244353;
int n,Q,k;
int head[N],cnt;
struct node{
int nxt,to;
}e[N];
void add(int u,int v){
e[++cnt]={head[u],v};head[u]=cnt;
}
int siz[N],dep[N],son[N],fa[N];
void dfs1(int now,int ff) //树剖
{
fa[now]=ff,dep[now]=dep[ff]+1,siz[now]=1;
int mx=0;
for(int i=head[now];i;i=e[i].nxt)
{
int v=e[i].to;
dfs1(v,now);
if(siz[v]>mx) mx=siz[v],son[now]=v;
siz[now]+=siz[v];
}
}
int dfn[N],tot,top[N];
void dfs2(int now,int tp)
{
dfn[now]=++tot,top[now]=tp;
if(son[now]) dfs2(son[now],tp);
for(int i=head[now];i;i=e[i].nxt)
{
int v=e[i].to;if(v==son[now]) continue;
dfs2(v,v);
}
}
int qpow(int n,int k)
{
int res=1;
for(;k;n=n*n%mod,k>>=1)
if(k&1) res=res*n%mod;
return res;
}
int a[N],sum[N];
int tr[N<<2],lz[N<<2];
int S(int l,int r){return (sum[r]-sum[l-1]+mod)%mod;}//线段树
void push_down(int now,int l,int r)
{
tr[ls]=(tr[ls]+S(l,mid)*lz[now]%mod)%mod,
tr[rs]=(tr[rs]+S(mid+1,r)*lz[now]%mod)%mod;
lz[ls]=(lz[ls]+lz[now])%mod,lz[rs]=(lz[rs]+lz[now])%mod;
lz[now]=0;
}
void modify(int now,int l,int r,int ml,int mr)
{
if(l==ml&&r==mr)
{
tr[now]=(tr[now]+S(l,r))%mod,lz[now]++;
return;
}
push_down(now,l,r);
if(mr<=mid) modify(ls,l,mid,ml,mr);
else if(ml>mid) modify(rs,mid+1,r,ml,mr);
else modify(ls,l,mid,ml,mid),modify(rs,mid+1,r,mid+1,mr);
tr[now]=(tr[ls]+tr[rs])%mod;
}
int query(int now,int l,int r,int ml,int mr)
{
if(l==ml&&r==mr) return tr[now];
push_down(now,l,r);
if(mr<=mid) return query(ls,l,mid,ml,mr);
else if(ml>mid) return query(rs,mid+1,r,ml,mr);
else return (query(ls,l,mid,ml,mid)+query(rs,mid+1,r,mid+1,mr))%mod;
}
void add(int x)
{
while(x)
{
modify(1,1,n,dfn[top[x]],dfn[x]);
x=fa[top[x]];
}
}
int ask(int x)
{
int res=0;
while(x)
{
res=(res+query(1,1,n,dfn[top[x]],dfn[x]))%mod;
x=fa[top[x]];
}
return res;
}
void init()
{
for(int i=1;i<=n;i++) a[i]=(qpow(dep[i],k)-qpow(dep[i]-1,k)+mod)%mod;
for(int i=1;i<=n;i++) sum[i]=(sum[i-1]+a[i])%mod;
}
int ans[N];
vector<pii> q[N];
signed main()
{
n=read(),Q=read(),k=read();
for(int i=2;i<=n;i++)
{
int x=read();
add(x,i);
}
dfs1(1,0),dfs2(1,1);
for(int i=1;i<=Q;i++)
{
pii x;int st;
st=read(),x.fi=read();x.se=i;
q[st].push_back(x);
}
init();
for(int i=1;i<=n;i++)
{
add(i);
for(auto j:q[i])
ans[j.se]=ask(j.fi);
}
for(int i=1;i<=Q;i++) printf("%lld\n",ans[i]);
return 0;
}