#include <bits/stdc++.h>
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
const long long INF = 0x3f3f3f3f3f3f3f3f;
const long long llinf = (1LL << 60);
const int inf = (1 << 30);
const int nmax = 2e5 + 50;
const long long mod = 1e9 + 7;
using namespace std;
int n, q, i, x, y, bl, tin[nmax], tout[nmax], lzy[4 * nmax], t, z, up[nmax][20],
    lvl[nmax];
pair<int, int> st[4 * nmax], pr;
set<pair<int, int> > s;
vector<int> a[nmax];
void dfs(int x, int p) {
  tin[x] = ++t;
  lvl[x] = lvl[p] + 1;
  up[x][0] = p;
  for (int i = 1; i < 18; i++) up[x][i] = up[up[x][i - 1]][i - 1];
  for (int i = 0; i < (int)a[x].size(); i++)
    if (a[x][i] != p) dfs(a[x][i], x);
  tout[x] = t;
}
int anc(int x, int y) { return tin[x] <= tin[y] && tout[y] <= tout[x]; }
pair<int, int> merge(pair<int, int> x, pair<int, int> y) {
  if (x.second == y.second)
    return make_pair(x.first + y.first, x.second);
  else if (x.second < y.second)
    return x;
  else
    return y;
}
void build(int x, int l, int r) {
  if (l == r) {
    st[x] = make_pair(1, 0);
    return;
  }
  int mid = (l + r) / 2;
  build(2 * x, l, mid);
  build(2 * x + 1, mid + 1, r);
  st[x] = merge(st[2 * x], st[2 * x + 1]);
}
void push(int nod, int l, int r) {
  if (!lzy[nod]) return;
  st[nod].second += lzy[nod];
  if (l != r) {
    lzy[nod * 2] += lzy[nod];
    lzy[nod * 2 + 1] += lzy[nod];
  }
  lzy[nod] = 0;
}
void upd(int nod, int l, int r, int tl, int tr, int v) {
  push(nod, l, r);
  if (tl <= l && r <= tr) {
    lzy[nod] += v;
    push(nod, l, r);
    return;
  }
  int mid = (l + r) / 2;
  if (tl <= mid) upd(nod * 2, l, mid, tl, tr, v);
  if (mid < tr) upd(nod * 2 + 1, mid + 1, r, tl, tr, v);
  push(nod * 2, l, mid);
  push(nod * 2 + 1, mid + 1, r);
  st[nod] = merge(st[nod * 2], st[nod * 2 + 1]);
}
pair<int, int> qry(int nod, int l, int r, int tl, int tr) {
  push(nod, l, r);
  if (tl > r || tr < l) return make_pair(0, inf);
  if (tl <= l && r <= tr) return st[nod];
  int mid = (l + r) / 2;
  return merge(qry(nod * 2, l, mid, tl, tr),
               qry(nod * 2 + 1, mid + 1, r, tl, tr));
}
int nd(int x, int d) {
  for (int i = 17; i >= 0; i--)
    if (d & (1 << i)) x = up[x][i];
  return x;
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cerr.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for (i = 1; i < n; i++) {
    cin >> x >> y;
    a[x].push_back(y);
    a[y].push_back(x);
  }
  dfs(1, 1);
  build(1, 1, n);
  while (q--) {
    cin >> x >> y;
    if (x > y) swap(x, y);
    if (anc(y, x)) swap(x, y);
    bl = anc(x, y) | anc(y, x);
    if (s.find(make_pair(x, y)) == s.end()) {
      s.insert(make_pair(x, y));
      if (bl) {
        z = nd(y, lvl[y] - lvl[x] - 1);
        upd(1, 1, n, tin[z], tout[z], 1);
        upd(1, 1, n, tin[y], tout[y], -1);
      } else {
        upd(1, 1, n, tin[1], tout[1], 1);
        upd(1, 1, n, tin[x], tout[x], -1);
        upd(1, 1, n, tin[y], tout[y], -1);
      }
    } else {
      s.erase(s.find(make_pair(x, y)));
      if (bl) {
        z = nd(y, lvl[y] - lvl[x] - 1);
        upd(1, 1, n, tin[z], tout[z], -1);
        upd(1, 1, n, tin[y], tout[y], 1);
      } else {
        upd(1, 1, n, tin[1], tout[1], -1);
        upd(1, 1, n, tin[x], tout[x], 1);
        upd(1, 1, n, tin[y], tout[y], 1);
      }
    }
    pr = qry(1, 1, n, tin[1], tout[1]);
    if (pr.second)
      cout << 0 << '\n';
    else
      cout << pr.first << '\n';
  }
  return 0;
}
