#include <bits/stdc++.h>
using namespace std;
const int nmax = 250005;
const long long linf = 1e17;
const long long mod = 1e9 + 7;
const int inf = 1e9 + 7;
const long long lim = 1e4;
int n, q;
int tin[nmax], tout[nmax], tt;
int up[nmax][25];
vector<int> g[nmax];
void dfs(int nod, int p) {
  tin[nod] = ++tt;
  up[nod][0] = p;
  for (long long i = 1; i <= 20; ++i) up[nod][i] = up[up[nod][i - 1]][i - 1];
  for (int j : g[nod]) {
    if (j != p) {
      dfs(j, nod);
    }
  }
  tout[nod] = tt;
}
bool anc(int a, int b) { return (tin[a] <= tin[b] && tout[a] >= tout[b]); }
int lz[4 * nmax];
pair<int, int> t[4 * nmax];
pair<int, int> combine(pair<int, int> a, pair<int, int> b) {
  if (a.first > b.first) return a;
  if (b.first > a.first) return b;
  return make_pair(a.first, a.second + b.second);
}
void push(int nod, int l, int r) {
  t[nod].first += lz[nod];
  if (l == r) {
    lz[nod] = 0;
  } else {
    lz[nod * 2] += lz[nod];
    lz[nod * 2 + 1] += lz[nod];
    lz[nod] = 0;
  }
}
void build(int v, int tl, int tr) {
  if (tl == tr) {
    t[v] = make_pair(0, 1);
  } else {
    int tm = (tl + tr) / 2;
    build(v * 2, tl, tm);
    build(v * 2 + 1, tm + 1, tr);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
}
pair<int, int> get_max(int v, int tl, int tr, int l, int r) {
  if (l > r || tl > tr) return make_pair(-inf, 0);
  push(v, tl, tr);
  if (l <= tl && r >= tr) return t[v];
  int tm = (tl + tr) / 2;
  push(v * 2, tl, tm);
  push(v * 2 + 1, tm + 1, tr);
  return combine(get_max(v * 2, tl, tm, l, r),
                 get_max(v * 2 + 1, tm + 1, tr, l, r));
}
void update(int v, int tl, int tr, int l, int r, int new_val) {
  if (l > tr || r < tl || tl > tr || l > r) return;
  push(v, tl, tr);
  if (l <= tl && tr <= r) {
    lz[v] += new_val;
  } else {
    int tm = (tl + tr) / 2;
    push(v * 2, tl, tm);
    push(v * 2 + 1, tm + 1, tr);
    update(v * 2, tl, tm, l, r, new_val);
    update(v * 2 + 1, tm + 1, tr, l, r, new_val);
    t[v] = combine(t[v * 2], t[v * 2 + 1]);
  }
  push(v, tl, tr);
}
int child(int a, int b) {
  int p = a;
  for (int i = 20; i >= 0; i--) {
    if (!anc(up[p][i], b)) p = up[p][i];
  }
  return p;
}
int main() {
  cin.tie(0);
  cout.tie(0);
  cin.sync_with_stdio(0);
  cout.sync_with_stdio(0);
  int a, b;
  cin >> n >> q;
  for (long long i = 1; i <= n - 1; ++i) {
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
  }
  set<pair<int, int> > edges;
  dfs(1, 1);
  int mx = 0;
  build(1, 1, n);
  for (long long i = 1; i <= q; ++i) {
    cin >> a >> b;
    if (a > b) swap(a, b);
    if (edges.count({a, b})) {
      mx--;
      if (anc(a, b)) {
        int c = child(b, a);
        update(1, 1, n, 1, n, -1);
        update(1, 1, n, tin[c], tout[c], 1);
        update(1, 1, n, tin[b], tout[b], -1);
      } else if (anc(b, a)) {
        int c = child(a, b);
        update(1, 1, n, 1, n, -1);
        update(1, 1, n, tin[c], tout[c], 1);
        update(1, 1, n, tin[a], tout[a], -1);
      } else {
        update(1, 1, n, tin[a], tout[a], -1);
        update(1, 1, n, tin[b], tout[b], -1);
      }
      edges.erase(edges.find({a, b}));
    } else {
      mx++;
      if (anc(a, b)) {
        int c = child(b, a);
        update(1, 1, n, 1, n, 1);
        update(1, 1, n, tin[c], tout[c], -1);
        update(1, 1, n, tin[b], tout[b], 1);
      } else if (anc(b, a)) {
        int c = child(a, b);
        update(1, 1, n, 1, n, 1);
        update(1, 1, n, tin[c], tout[c], -1);
        update(1, 1, n, tin[a], tout[a], 1);
      } else {
        update(1, 1, n, tin[a], tout[a], 1);
        update(1, 1, n, tin[b], tout[b], 1);
      }
      edges.insert({a, b});
    }
    pair<int, int> ans = get_max(1, 1, n, 1, n);
    if (ans.first == mx) {
      cout << ans.second << '\n';
    } else {
      cout << 0 << '\n';
    }
  }
}
