// ROOT : DRAGON3012009 : WA in Real Life
#include <bits/stdc++.h>
#define FOR(i,l,r) for(int i = l ; i <= r ; i ++)
#define FORD(i,r,l) for(int i = r ; i >= l ; i --)
#define REP(i, a ) for(int i = 0 ; i < a ; i ++ )
#define compare(v) sort((v).begin(), (v).end()); (v).erase(unique((v).begin(), (v).end()), (v).end());
#define ll long long
#define el "\n"
#define fi first
#define se second
#define _ROOT_ int main()
#define M 1000000007
#define MAXN 1000001
#define Bit(i) (1LL << i )
#define INF (1ll<<30)
#define BLOCK 425
#define NAME "file"
#define debug(a) cout << #a << " = " << a << endl;
using namespace std;

ll n, m, q ;
ll c[MAXN] ;
ll cnt[MAXN ] ;
ll freg[MAXN ] ;
ll res[MAXN ] ;
ll st[MAXN ], fin[MAXN ], tour[MAXN ], timeDfs ;

vector<ll> adj[MAXN ] ;

void addC(ll color ) {
    cnt[color ] ++ ;
    freg[cnt[color]] ++ ;
}

void delC(ll color ) {
    freg[cnt[color]] -- ;
    cnt[color] -- ;
}

struct Data {
    ll l, r, k, id ;
    bool operator < (const Data & other ) const {
        ll A = l / BLOCK, B = other.l / BLOCK ;
        if(A == B ) return (A % 2 == 0 ? r < other.r : r > other.r ) ;
        return A < B ;
    }
};
vector<Data> que ;

void dfs(ll u, ll p ) {
    st[u] = ++ timeDfs ;
    tour[timeDfs ] = u ;
    for(ll v : adj[u]) if(v != p ) {
            dfs(v, u ) ;
        }
    fin[u] = timeDfs ;
}

void init() {
    cin >> n >> q ;
    FOR(i, 1, n ) cin >> c[i] ;
    FOR(i, 2, n ) {
        ll x, y ;
        cin >> x >> y ;
        adj[x].push_back(y) ;
        adj[y].push_back(x) ;
    }
}

void solve() {
    dfs(1 , 1 ) ;

    FOR(cnt , 1 , q ) {
    ll x , k ; cin >> x >> k ;
    que.push_back({st[x] , fin[x] , k , cnt }) ;
    }
    sort(que.begin() , que.end() ) ;
    ll l = 1 , r = 0 ;
    for(auto [l1 , r1 , k , id ] : que ) {

        while(r < r1 ) addC(c[tour[ ++ r]] ) ;
        while(l > l1 ) addC(c[tour[-- l ]] ) ;

        while(l < l1 ) delC(c[tour[l ++ ]] ) ;
        while(r > r1 ) delC(c[tour[r -- ]] ) ;
        res[id] = freg[k] ;
    }

    FOR(i, 1, q ) cout << res[i] << el ;
}


_ROOT_ {
//    freopen(NAME".inp", "r", stdin);
//    freopen(NAME".out", "w", stdout) ;
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1; // cin >> t ;
    while(t--) {
        init();
        solve();
    }
    return (0&0);
}
