func_code_string: #include <bits/stdc++.h>   using namespace std;   const int N = 310000;   int n, m, cs[N], cd[N], nr, rez[N], aint[4 * N], full[4 * N];   vector<int> v[N];   vector<pair<int, int> > x[N];   bool ver[N];   void df(int nod) {     ver[nod] = 1;     cs[nod] = ++nr;     for (vector<int>::iterator it = v[nod].begin(); it != v[nod].end(); ++it)       if (!ver[*it]) df(*it);     cd[nod] = nr;   }   void update(int nod, int pozx, int pozy, int poz1, int poz2, int val) {     if (pozx >= poz1 && poz2 >= pozy) {       full[nod] += val;       if (full[nod])         aint[nod] = pozy - pozx + 1;       else         aint[nod] = aint[2 * nod] + aint[2 * nod + 1];       return;     }     int mid = (pozx + pozy) / 2;     if (mid >= poz1) update(2 * nod, pozx, mid, poz1, poz2, val);     if (mid < poz2) update(2 * nod + 1, mid + 1, pozy, poz1, poz2, val);     if (full[nod])       aint[nod] = pozy - pozx + 1;     else       aint[nod] = aint[2 * nod + 1] + aint[2 * nod];   }   void df2(int nod) {     vector<pair<int, int> >::iterator i;     vector<int>::iterator it;     ver[nod] = 1;     for (i = x[nod].begin(); i != x[nod].end(); ++i) {       update(1, 1, n, i->first, i->second, 1);     }     rez[nod] = max(0, aint[1] - 1);     for (it = v[nod].begin(); it != v[nod].end(); ++it)       if (!ver[*it]) df2(*it);     for (i = x[nod].begin(); i != x[nod].end(); ++i)       update(1, 1, n, i->first, i->second, -1);   }   int main() {     int i, a, b;     cin >> n >> m;     for (i = 1; i != n; ++i) {       cin >> a >> b;       v[a].push_back(b);       v[b].push_back(a);     }     df(1);     for (i = 1; i <= m; ++i) {       cin >> a >> b;       x[a].push_back(pair<int, int>(cs[a], cd[a]));       x[b].push_back(pair<int, int>(cs[b], cd[b]));       x[a].push_back(pair<int, int>(cs[b], cd[b]));       x[b].push_back(pair<int, int>(cs[a], cd[a]));     }     for (i = 1; i <= n; ++i) ver[i] = 0;     df2(1);     for (i = 1; i <= n; ++i) cout << rez[i] <<    ;     return 0;   }   