func_code_string: #include <bits/stdc++.h>   const int fin = 0, maxn = 400000, maxm = maxn << 1;   int n, m, cent, tot;   int fs[maxn], e[maxm], next[maxm];   int bel[maxn], pos[maxn], len[maxn], left[maxn];   int c[maxn], deg[maxn], b[maxn];   bool v[maxn];   struct rec {     int x, y;   } g[maxn];   int sum(int *a, int n, int x) {     int s = 0;     for (; x; x -= ((x) & (-(x)))) s += a[x];     return s;   }   void upd(int *a, int n, int x, int w) {     for (; x <= n; x += ((x) & (-(x)))) a[x] += w;   }   inline void addedge(int x, int y) {     e[++m] = y;     next[m] = fs[x];     fs[x] = m;     e[++m] = x;     next[m] = fs[y];     fs[y] = m;   }   void init() {     int i;     scanf( %d , &n);     m = 0;     for (i = 1; i < n; ++i) {       scanf( %d%d , &g[i].x, &g[i].y);       addedge(g[i].x, g[i].y);       deg[g[i].x]++;       deg[g[i].y]++;     }     cent = 0;     for (i = 1; i <= n; ++i)       if (deg[i] > 2) {         cent = i;         break;       }     if (!cent) cent = 1;   }   void build() {     int i, j, p, k, t;     i = fs[cent];     tot = 0;     v[cent] = true;     bel[cent] = 0;     for (j = 1; j <= deg[cent]; ++j) {       p = e[i];       bel[p] = j;       v[p] = true;       b[++tot] = p;       pos[p] = 1;       left[j] = tot;       while (next[fs[p]]) {         if (v[e[fs[p]]])           t = e[next[fs[p]]];         else           t = e[fs[p]];         v[t] = true;         b[++tot] = t;         bel[t] = j;         pos[t] = pos[p] + 1;         p = t;       }       len[j] = tot - left[j] + 1;       i = next[i];       for (k = 1; k <= len[j]; ++k) upd(c + left[j] - 1, len[j], k, 1);     }   }   void solve() {     int que, x, y, j, t, type, p, k;     scanf( %d , &que);     while (que--) {       scanf( %d , &type);       if (type == 1) {         scanf( %d , &p);         x = g[p].x;         y = g[p].y;         if ((!bel[x]) || (!bel[y])) {           j = bel[y] + bel[x];           upd(c + left[j] - 1, len[j], 1, 1);         } else {           j = bel[x];           if (pos[x] > pos[y])             k = pos[x];           else             k = pos[y];           upd(c + left[j] - 1, len[j], k, 1);         }       } else if (type == 2) {         scanf( %d , &p);         x = g[p].x;         y = g[p].y;         if ((!bel[x]) || (!bel[y])) {           j = bel[y] + bel[x];           upd(c + left[j] - 1, len[j], 1, -1);         } else {           j = bel[x];           if (pos[x] > pos[y])             k = pos[x];           else             k = pos[y];           upd(c + left[j] - 1, len[j], k, -1);         }       } else {         scanf( %d%d , &x, &y);         if (x == y)           printf( 0 n );         else {           if ((!bel[x]) || (!bel[y])) {             j = bel[x] + bel[y];             if (!bel[x])               k = pos[y];             else               k = pos[x];             t = sum(c + left[j] - 1, len[j], k);             if (t == k)               printf( %d n , t);             else               printf( -1 n );           } else if (bel[x] == bel[y]) {             j = bel[x];             if (pos[x] > pos[y]) {               t = x;               x = y;               y = t;             }             t = sum(c + left[j] - 1, len[j], pos[y]) -                 sum(c + left[j] - 1, len[j], pos[x]);             if (t == pos[y] - pos[x])               printf( %d n , t);             else               printf( -1 n );           } else {             j = bel[x];             t = sum(c + left[j] - 1, len[j], pos[x]);             j = bel[y];             t += sum(c + left[j] - 1, len[j], pos[y]);             if (t == pos[x] + pos[y])               printf( %d n , t);             else               printf( -1 n );           }         }       }     }   }   int main() {     if (fin) {       freopen( t.in ,  r , stdin);       freopen( t.out ,  w , stdout);     }     init();     build();     solve();     if (fin) {       fclose(stdin);       fclose(stdout);     }     return 0;   }   