#include <bits/stdc++.h>
using namespace std;

#define int long long

const int N = 100005;

vector<int> g[N];

int color[N];

int sz[N];
int heavy[N];

bool big[N];

vector<pair<int,int>> query[N];

int ans[N];

int cntColor[N];

struct BIT
{
    int bit[N];

    void add(int idx, int val)
    {
        while(idx < N)
        {
            bit[idx] += val;
            idx += idx & -idx;
        }
    }

    int sum(int idx)
    {
        int s = 0;

        while(idx > 0)
        {
            s += bit[idx];
            idx -= idx & -idx;
        }

        return s;
    }

    int range(int l, int r)
    {
        return sum(r) - sum(l-1);
    }

} fw;

void getsz(int u, int p)
{
    sz[u] = 1;

    heavy[u] = -1;

    int mx = 0;

    for(int v : g[u])
    {
        if(v == p) continue;

        getsz(v, u);

        sz[u] += sz[v];

        if(sz[v] > mx)
        {
            mx = sz[v];
            heavy[u] = v;
        }
    }
}

void add(int u, int p, int val)
{
    int c = color[u];

    int old = cntColor[c];

    if(old)
        fw.add(old, -1);

    cntColor[c] += val;

    int now = cntColor[c];

    if(now)
        fw.add(now, +1);

    for(int v : g[u])
    {
        if(v == p || big[v]) continue;

        add(v, u, val);
    }
}

void dfs(int u, int p, bool keep)
{
    for(int v : g[u])
    {
        if(v == p || v == heavy[u]) continue;

        dfs(v, u, 0);
    }

    if(heavy[u] != -1)
    {
        dfs(heavy[u], u, 1);

        big[heavy[u]] = 1;
    }

    add(u, p, +1);

    for(auto [x, id] : query[u])
    {
        ans[id] = fw.range(x, N-1);
    }

    if(heavy[u] != -1)
        big[heavy[u]] = 0;

    if(!keep)
    {
        add(u, p, -1);
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;

    cin >> n >> q;

    for(int i = 1; i <= n; i++)
        cin >> color[i];

    for(int i = 1; i < n; i++)
    {
        int u, v;

        cin >> u >> v;

        g[u].push_back(v);
        g[v].push_back(u);
    }

    for(int i = 1; i <= q; i++)
    {
        int u, x;

        cin >> u >> x;

        query[u].push_back({x, i});
    }

    getsz(1, 0);

    dfs(1, 0, 1);

    for(int i = 1; i <= q; i++)
    {
        cout << ans[i] << '\n';
    }
}