初始代码:
#include<bits/stdc++.h>
using namespace std;
#define blk(i) (((i)-1)/B+1)
#define lft(i) (((i)-1)*B+1)
#define rgt(i) min((i)*B,n)
const int N=114514;
int n,Q,l=1,B,r,s[N],a[N],rec[N],ans[N],dfn[N],sz[N],nfd[N],idx;
struct edge
{
int to,next;
};
struct graph
{
int cnt;
int head[N];
edge e[N];
void clear()
{
cnt=0;
memset(head,0,sizeof(head));
}
void add(int u,int v)
{
e[++cnt]=(edge){v,head[u]};
head[u]=cnt;
}
#define wk(i,g,u) for(int i=g.head[u];i;i=g.e[i].next)
}g;
struct query
{
int l,r,k,no;
bool operator<(query a)
{
if(blk(l)^blk(a.l))return blk(l)<blk(a.l);
return r<a.r;
}
}q[N];
void dfs(int u,int fa)
{
sz[u]=1;
dfn[u]=++idx;
nfd[idx]=u;
wk(i,g,u)
{
int v=g.e[i].to;
if(v==fa)continue;
dfs(v,u);
sz[u]+=sz[v];
}
}
void add(int u)
{
s[++rec[a[nfd[u]]]]++;
}
void del(int u)
{
s[rec[a[nfd[u]]]--]--;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>Q;
B=sqrt(n);
for(int i=1;i<=n;i++)cin>>a[i];
g.clear();
for(int i=1,u,v;i<n;i++)
{
cin>>u>>v;
g.add(u,v);
g.add(v,u);
}
dfs(1,0);
for(int i=1,u;i<=Q;i++)
{
cin>>u>>q[i].k;
q[i].l=dfn[u];
q[i].r=dfn[u]+sz[u]-1;
q[i].no=i;
}
sort(q+1,q+Q+1);
for(int i=1;i<=Q;i++)
{
while(q[i].l<l)add(--l);
while(q[i].r>r)add(++r);
while(q[i].l>l)del(l++);
while(q[i].r<r)del(r--);
ans[q[i].no]=s[q[i].k];
}
for(int i=1;i<=Q;i++)cout<<ans[i]<<'\n';
}
火车头,fread+fwrite超级快读,调整块长114514次,函数展开均无效