http://page.renren.com/601081183/note/865145486?null&ref=minifeed&sfet=2011&fin=1&ff_id=601081183&feed=page_reblog&tagid=1981432999&statID=page_601081183_2&level=2
#pragma comment(linker, "/STACK:1024000000,1024000000")//手动加大栈的空间
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <map>
#include <vector>
#include <algorithm>
using namespace std;
const int N=100003;
int w[N];
int val[N];
int vis[N];
int num[N];
int C[N];
int n,k;
map<int,int>mp;
vector<int>pp[N];
vector<int>edge[N];
int Lef[N];
int Rit[N];
int tmp;
struct Node
{
int LL;
int RR;
int id;
}query[N];
bool cmp(Node a,Node b)
{
return a.RR<=b.RR;
}
void dfs(int u)
{
vis[u]=1;
Lef[u]=Rit[u]=tmp;
val[tmp]=w[u];
tmp++;
for(int i=0;i<edge[u].size();i++)
{
int v=edge[u][i];
if(!vis[v])
{dfs(v);
Rit[u]=Rit[v];}
}
}
int lowbit(int a)
{
return a&(-a);
}
void modify(int p,int c)
{
for(int i=p;i<=n+2;i+=lowbit(i))
C[i]+=c;
}
int getsum(int p)
{
int sum=0;
for(int i=p;i>0;i-=lowbit(i))
sum+=C[i];
return sum;
}
int main()
{
int cas;
scanf("%d",&cas);
int T=1;
while(cas--)
{
memset(C,0,sizeof(C));
int cnt=0;
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
pp[i].clear(), edge[i].clear();
mp.clear();
for(int i=1;i<=n;i++)
{
scanf("%d",&w[i]);
if(!mp[w[i]])
{
mp[w[i]]=++cnt;
pp[cnt].push_back(0);
}
w[i]=mp[w[i]];
}
int u,v;
for(int i=1;i<n;i++)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
tmp=1;
memset(vis,0,sizeof(vis));
dfs(1);
int q;
int t;
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
scanf("%d",&t);
query[i].LL=Lef[t];
query[i].RR=Rit[t];
query[i].id=i;
}
sort(query+1,query+q+1,cmp);
int nn=1;
int ans[N];
for(int i=1;i<=n;i++)
{
int v=val[i];
pp[v].push_back(i);
int g=pp[v].size()-1;
if(g>=k)
{
if(g>k)
{
modify(pp[v][g-k-1]+1,-1);
modify(pp[v][g-k]+1,1);
}
modify(pp[v][g-k]+1, 1);
modify(pp[v][g-k+1]+1, -1);
}
while(query[nn].RR==i)
{
ans[query[nn].id]=getsum(query[nn].LL);
nn++;
}
}
if (T>1) puts("");
printf("Case #%d:\n",T++);
for(int i=1;i<=q;i++)
printf("%d\n",ans[i]);
}
return 0;
}