Discription

You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will assume that the tree vertices are numbered by integers from 1 to n. Then we represent the color of vertex v as cv. The tree root is a vertex with number 1.

In this problem you need to answer to m queries. Each query is described by two integers vj, kj. The answer to query vj, kj is the number of such colors of vertices x, that the subtree of vertex vj contains at least kj vertices of color x.

You can find the definition of a rooted tree by the following link: http://en.wikipedia.org/wiki/Tree_(graph_theory).

Input

The first line contains two integers n and m (2 ≤ n ≤ 105; 1 ≤ m ≤ 105). The next line contains a sequence of integers c1, c2, ..., cn (1 ≤ ci ≤ 105). The next n - 1 lines contain the edges of the tree. The i-th line contains the numbers ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — the vertices connected by an edge of the tree.

Next m lines contain the queries. The j-th line contains two integers vj, kj (1 ≤ vj ≤ n; 1 ≤ kj ≤ 105).

Output

Print m integers — the answers to the queries in the order the queries appear in the input.

Example

Input
8 5
1 2 2 3 3 2 3 3
1 2
1 5
2 3
2 4
5 6
5 7
5 8
1 2
1 3
1 4
2 3
5 3
Output
2
2
1
0
1
Input
4 1
1 2 3 4
1 2
2 3
3 4
1 1
Output
4

Note

A subtree of vertex v in a rooted tree with root r is a set of vertices {u : dist(r, v) + dist(v, u) = dist(r, u)}. Where dist(x, y) is the length (in edges) of the shortest path between vertices x and y.

dfs+莫队,本来挺傻的一个题,结果莫队写错了2333

以前都不是很在意莫队区间端点的移动,但是今天的事情证明了,莫队端点移动要先扩张区间,然后再缩减区间,不然有些题出现了左端点比右端点大的区间会挂掉2333

#include<bits/stdc++.h>
#define ll long long
const int maxn=100005;
using namespace std;
struct ask{
int l,r,k,bl,num;
bool operator <(const ask &u)const{
return bl==u.bl?((bl&1)?r<u.r:r>u.r):bl<u.bl;
}
}q[maxn];
int f[maxn],col[maxn];
int to[maxn*2],ne[maxn*2],hd[maxn];
int dfn[maxn],n,m,a[maxn],siz[maxn];
int cnt[maxn],dc=0,sz,ans[maxn],le,ri; void dfs(int x,int fa){
dfn[x]=++dc,a[dc]=col[x],siz[x]=1;
for(int i=hd[x];i;i=ne[i]) if(to[i]!=fa){
dfs(to[i],x);
siz[x]+=siz[to[i]];
}
} inline void update(int x,int y){
for(;x<=100000;x+=x&-x) f[x]+=y;
} inline int query(int x){
int an=0;
for(;x;x-=x&-x) an+=f[x];
return an;
} inline void add(int x){
if(cnt[a[x]]) update(cnt[a[x]],-1);
cnt[a[x]]++;
update(cnt[a[x]],1);
} inline void del(int x){
update(cnt[a[x]],-1);
cnt[a[x]]--;
if(cnt[a[x]]) update(cnt[a[x]],1);
} inline void solve(){
sort(q+1,q+m+1),le=1,ri=0;
for(int i=1;i<=m;i++){
while(ri<q[i].r) ri++,add(ri);
while(le>q[i].l) le--,add(le);
while(ri>q[i].r) del(ri),ri--;
while(le<q[i].l) del(le),le++;
ans[q[i].num]=query(100000)-query(q[i].k-1);
}
} int main(){
scanf("%d%d",&n,&m),sz=sqrt(n);
for(int i=1;i<=n;i++) scanf("%d",col+i);
int uu,vv;
for(int i=1;i<n;i++){
scanf("%d%d",&uu,&vv);
to[i]=vv,ne[i]=hd[uu],hd[uu]=i;
to[i+n]=uu,ne[i+n]=hd[vv],hd[vv]=i+n;
}
dfs(1,1);
for(int i=1;i<=m;i++){
scanf("%d%d",&uu,&vv);
q[i].num=i,q[i].k=vv,q[i].l=dfn[uu],q[i].r=dfn[uu]+siz[uu]-1;
q[i].bl=(q[i].l-1)/sz+1;
} solve(); for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
return 0;
}

Codeforces 375 D Tree and Queries的更多相关文章

  1. codeforces 375D:Tree and Queries

    Description You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. ...

  2. Codeforces 375D D. Tree and Queries

    传送门 题意: 给一棵树,每个节点有一个颜色,询问x为根的子树,出现次数大于等于k的颜色个数. 输入格式: 第一行 2 个数 n,m 表示节点数和询问数. 接下来一行 n 个数,第 i 个数 ci ​ ...

  3. [Codeforces Round #221 (Div. 1)][D. Tree and Queries]

    题目链接:375D - Tree and Queries 题目大意:给你一个有n个点的树,每个点都有其对应的颜色,给出m次询问(v,k),问v的子树中有多少种颜色至少出现k次 题解:先对所有的询问进行 ...

  4. Codeforces 375D Tree and Queries(DFS序+莫队+树状数组)

    题目链接  Tree and Queries 题目大意  给出一棵树和每个节点的颜色.每次询问$vj, kj$ 你需要回答在以$vj$为根的子树中满足条件的的颜色数目, 条件:具有该颜色的节点数量至少 ...

  5. CodeForces 375D Tree and Queries 莫队||DFS序

    Tree and Queries 题意:有一颗以1号节点为根的树,每一个节点有一个自己的颜色,求出节点v的子数上颜色出现次数>=k的颜色种类. 题解:使用莫队处理这个问题,将树转变成DFS序区间 ...

  6. codeforces 570 D. Tree Requests 树状数组+dfs搜索序

    链接:http://codeforces.com/problemset/problem/570/D D. Tree Requests time limit per test 2 seconds mem ...

  7. 【19.77%】【codeforces 570D】Tree Requests

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. Problem - D - Codeforces Fix a Tree

    Problem - D - Codeforces  Fix a Tree 看完第一名的代码,顿然醒悟... 我可以把所有单独的点全部当成线,那么只有线和环. 如果全是线的话,直接线的条数-1,便是操作 ...

  9. codeforces 570 D Tree Requests

    题意:给出一棵树.每一个结点都有一个字母,有非常多次询问,每次询问.以结点v为根的子树中高度为h的后代是否可以经过调整变成一个回文串. 做法: 推断能否够构成一个回文串的话,仅仅须要知道是否有大于一个 ...

随机推荐

  1. js常用技巧汇总

    将彻底屏蔽鼠标右键 oncontextmenu="window.event.returnvalue=false" <table border oncontextmenu=re ...

  2. C++系统学习之八:IO库

    新的C++标准中有三分之二的内容都是描述标准库.接下来重点学习其中几种核心库设施,这些是应该熟练掌握的. 标准库的核心是很多容器类(顺序容器和关联容器等)和一簇泛型算法(该类算法通常在顺序容器一定范围 ...

  3. LeetCode 字符串的排列

    给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列. 换句话说,第一个字符串的排列之一是第二个字符串的子串. 示例1: 输入: s1 = "ab" s2 ...

  4. 【Java_多线程并发编程】基础篇——线程状态扭转函数

    1. wait() sleep() yield() join()用法与区别 本文提到的当前线程是指:当前时刻,获得CPU资源正在执行的线程. 1.1 wait()方法 wait()方法定义在Objec ...

  5. kvm虚拟化存储管理

    1. kvm虚拟化存储介绍 KVM 的存储虚拟化是通过存储池(Storage Pool)和卷(Volume)来管理的.Storage Pool 是宿主机上可以看到的一片存储空间,可以是多种型: Vol ...

  6. CSS3-::selection

    “::selection”只能设置两个属性,一个就是background,另一个就是color属性,设置其他属性是没有任何效果的. ::selection使用语法: /*Webkit,Opera9.5 ...

  7. (转)Duplicate Symbol链接错的原因总结和解决方法

    duplicate symbol是一种常见的链接错误,不像编译错误那样可以直接定位到问题的所在.但是经过一段时间的总结,发现这种错误总是有一些规律可以找的.例如,我们有如下的最简单的两个类代码: // ...

  8. 基础训练 2n皇后问题

    2n皇后问题 #include<iostream> #include<vector> using namespace std; int cnt = 0, n; vector&l ...

  9. nw335 debian sid x86-64 -- 2 驱动的方式

    1 linux内核自带 2 realtek 提供的官方驱动 3 使用xp的驱动 4 第三方驱动(现在成功的,最好的方式)

  10. 关于hadoop学习的思考(一) —— 小的知识点的总结

    一.对于CDH的小总结: CDH:是Cloudera公司在Apache开源项目hadoop的基础上发型的,共有五个版本前两个已不再更新,最经的两个分别是CDH4(基于hadoop2.0.0版本演化而来 ...