#include <bits/stdc++.h>
#define FNAME ""
using namespace std;
typedef long long ll;
const int MAXN = (int)1e5 + 5;
const int LIM = (int)1e6 + 1;
const long long MOD = (long long)1e13 + 15092007;
#define xd '\n'
#define pii pair<int, int>
#define pll pair<long long, long long>
#define pli pair<long long, int>
#define fi first
#define se second
const long long base = (long long)256;
const long long INF = (long long)1e14;
template<class X, class Y> bool minimize(X &a, Y b) {if(a>b){a=b;return true;}return false;};
template<class X, class Y> bool maximize(X &a, Y b) {if(a<b){a=b;return true;}return false;};
void HuuThien() {
ios_base::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
if (fopen(FNAME".inp", "r")) {
freopen(FNAME".inp", "r", stdin);
freopen(FNAME".out", "w", stdout);
}
}
int n, q;
vector<int> adj[MAXN];
int Size[MAXN], parent[MAXN], heavy[MAXN];
int pos[MAXN], head[MAXN], depth[MAXN], timeDFS = 0;
vector<int> segTree(4 * MAXN, 0);
vector<int> lazy(4 * MAXN);
vector<pair<int, int>> edges;
void Push(int node, int l, int r) {
if(lazy[node]) {
segTree[node] += (r - l + 1) * lazy[node];
if(l ^ r) {
lazy[2 * node] += lazy[node];
lazy[2 * node + 1] += lazy[node];
}
lazy[node] = 0;
}
}
void update(int node, int l, int r, int wl, int wr, int value) {
if(l > wr || r < wl) return;
if(l == r) {
lazy[node] += value;
Push(node, l, r);
return;
}
int mid = (l + r) / 2;
update(2 * node, l, mid, wl, wr, value);
update(2 * node + 1, mid + 1, r, wl, wr, value);
segTree[node] = segTree[2 * node] + segTree[2 * node + 1];
}
long long getSUM(int node, int l, int r, int wl, int wr) {
Push(node, l, r);
if(l > wr || r < wl) return 0;
if(wl <= l && r <= wr) return segTree[node];
int mid = (l + r) / 2;
int s1 = getSUM(2 * node, l, mid, wl, wr);
int s2 = getSUM(2 * node + 1, mid + 1, r, wl, wr);
return s1 + s2;
}
void dfs(int u, int pa) {
Size[u] = 1;
depth[u] = (pa == -1 ? 0 : depth[pa] + 1);
parent[u] = pa;
heavy[u] = -1;
int numnode = 0;
for(int v : adj[u]) {
if(v == pa) continue;
dfs(v, u);
Size[u] += Size[v];
if(maximize(numnode, Size[v])) {
heavy[u] = v;
}
}
}
void HLD(int u, int h) {
head[u] = h;
pos[u] = ++timeDFS;
if(heavy[u] != -1) {
HLD(heavy[u], h);
}
for(int v : adj[u]) {
if(v == parent[u] || v == heavy[u]) continue;
HLD(v, v);
}
}
void add_path(int u, int v) {
while(head[u] != head[v]) {
if(depth[head[u]] < depth[head[v]]) swap(u, v);
update(1, 1, n, pos[head[u]], pos[u], 1);
u = parent[head[u]];
}
if(depth[u] > depth[v]) swap(u, v);
update(1, 1, n, pos[u], pos[v], 1);
}
long long getPath(int x) {
int u = edges[x].first;
int v = edges[x].second;
int node = (depth[u] > depth[v] ? v : u);
return getSUM(1, 1, n, pos[node], pos[node]);
}
void Init() {
cin >> n >> q;
for(int i = 1; i <= n - 1 ; i++) {
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
edges.push_back({u, v});
}
dfs(1, -1);
HLD(1, 1);
while(q--) {
int choose;
cin >> choose;
if(choose == 1) {
int u, v;
cin >> u >> v;
add_path(u, v);
} else {
int x;
cin >> x;
cout << getPath(x) << xd;
}
}
}
signed main() {
HuuThien();
Init();
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgRk5BTUUgIiIKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdHlwZWRlZiBsb25nIGxvbmcgbGw7CmNvbnN0IGludCBNQVhOID0gKGludCkxZTUgKyA1Owpjb25zdCBpbnQgTElNID0gKGludCkxZTYgKyAxOwpjb25zdCBsb25nIGxvbmcgTU9EID0gKGxvbmcgbG9uZykxZTEzICsgMTUwOTIwMDc7CiNkZWZpbmUgeGQgJ1xuJwojZGVmaW5lIHBpaSBwYWlyPGludCwgaW50PgojZGVmaW5lIHBsbCBwYWlyPGxvbmcgbG9uZywgbG9uZyBsb25nPgojZGVmaW5lIHBsaSBwYWlyPGxvbmcgbG9uZywgaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCmNvbnN0IGxvbmcgbG9uZyBiYXNlID0gKGxvbmcgbG9uZykyNTY7CmNvbnN0IGxvbmcgbG9uZyBJTkYgPSAobG9uZyBsb25nKTFlMTQ7CnRlbXBsYXRlPGNsYXNzIFgsIGNsYXNzIFk+IGJvb2wgbWluaW1pemUoWCAmYSwgWSBiKSB7aWYoYT5iKXthPWI7cmV0dXJuIHRydWU7fXJldHVybiBmYWxzZTt9Owp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPiBib29sIG1heGltaXplKFggJmEsIFkgYikge2lmKGE8Yil7YT1iO3JldHVybiB0cnVlO31yZXR1cm4gZmFsc2U7fTsKCnZvaWQgSHV1VGhpZW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsgY291dC50aWUoMCk7CiAgICBpZiAoZm9wZW4oRk5BTUUiLmlucCIsICJyIikpIHsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5pbnAiLCAiciIsIHN0ZGluKTsKICAgICAgICBmcmVvcGVuKEZOQU1FIi5vdXQiLCAidyIsIHN0ZG91dCk7CiAgICB9IAp9CiAgICAKaW50IG4sIHE7CnZlY3RvcjxpbnQ+IGFkaltNQVhOXTsKaW50IFNpemVbTUFYTl0sIHBhcmVudFtNQVhOXSwgaGVhdnlbTUFYTl07CmludCBwb3NbTUFYTl0sIGhlYWRbTUFYTl0sIGRlcHRoW01BWE5dLCB0aW1lREZTID0gMDsKdmVjdG9yPGludD4gc2VnVHJlZSg0ICogTUFYTiwgMCk7CnZlY3RvcjxpbnQ+IGxhenkoNCAqIE1BWE4pOwp2ZWN0b3I8cGFpcjxpbnQsIGludD4+IGVkZ2VzOwoKdm9pZCBQdXNoKGludCBub2RlLCBpbnQgbCwgaW50IHIpIHsKICAgIGlmKGxhenlbbm9kZV0pIHsKICAgICAgICBzZWdUcmVlW25vZGVdICs9IChyIC0gbCArIDEpICogbGF6eVtub2RlXTsKICAgICAgICBpZihsIF4gcikgewogICAgICAgICAgICBsYXp5WzIgKiBub2RlXSArPSBsYXp5W25vZGVdOwogICAgICAgICAgICBsYXp5WzIgKiBub2RlICsgMV0gKz0gbGF6eVtub2RlXTsKICAgICAgICB9CiAgICAgICAgbGF6eVtub2RlXSA9IDA7CiAgICB9Cn0KCnZvaWQgdXBkYXRlKGludCBub2RlLCBpbnQgbCwgaW50IHIsIGludCB3bCwgaW50IHdyLCBpbnQgdmFsdWUpIHsKICAgIGlmKGwgPiB3ciB8fCByIDwgd2wpIHJldHVybjsKICAgIGlmKGwgPT0gcikgewogICAgICAgIGxhenlbbm9kZV0gKz0gdmFsdWU7CiAgICAgICAgUHVzaChub2RlLCBsLCByKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwoKICAgIHVwZGF0ZSgyICogbm9kZSwgbCwgbWlkLCB3bCwgd3IsIHZhbHVlKTsKICAgIHVwZGF0ZSgyICogbm9kZSArIDEsIG1pZCArIDEsIHIsIHdsLCB3ciwgdmFsdWUpOwoKICAgIHNlZ1RyZWVbbm9kZV0gPSBzZWdUcmVlWzIgKiBub2RlXSArIHNlZ1RyZWVbMiAqIG5vZGUgKyAxXTsKfSAKCmxvbmcgbG9uZyBnZXRTVU0oaW50IG5vZGUsIGludCBsLCBpbnQgciwgaW50IHdsLCBpbnQgd3IpIHsKICAgIFB1c2gobm9kZSwgbCwgcik7CiAgICBpZihsID4gd3IgfHwgciA8IHdsKSByZXR1cm4gMDsKICAgIGlmKHdsIDw9IGwgJiYgciA8PSB3cikgcmV0dXJuIHNlZ1RyZWVbbm9kZV07CgogICAgaW50IG1pZCA9IChsICsgcikgLyAyOwogICAgaW50IHMxID0gZ2V0U1VNKDIgKiBub2RlLCBsLCBtaWQsIHdsLCB3cik7CiAgICBpbnQgczIgPSBnZXRTVU0oMiAqIG5vZGUgKyAxLCBtaWQgKyAxLCByLCB3bCwgd3IpOwoKICAgIHJldHVybiBzMSArIHMyOwp9Cgp2b2lkIGRmcyhpbnQgdSwgaW50IHBhKSB7CiAgICBTaXplW3VdID0gMTsKICAgIGRlcHRoW3VdID0gKHBhID09IC0xID8gMCA6IGRlcHRoW3BhXSArIDEpOwogICAgcGFyZW50W3VdID0gcGE7CiAgICBoZWF2eVt1XSA9IC0xOwogICAgaW50IG51bW5vZGUgPSAwOwoKICAgIGZvcihpbnQgdiA6IGFkalt1XSkgewogICAgICAgIGlmKHYgPT0gcGEpIGNvbnRpbnVlOwogICAgICAgIGRmcyh2LCB1KTsKICAgICAgICBTaXplW3VdICs9IFNpemVbdl07CiAgICAgICAgaWYobWF4aW1pemUobnVtbm9kZSwgU2l6ZVt2XSkpIHsKICAgICAgICAgICAgaGVhdnlbdV0gPSB2OwogICAgICAgIH0KICAgIH0KfQoKdm9pZCBITEQoaW50IHUsIGludCBoKSB7CiAgICBoZWFkW3VdID0gaDsKICAgIHBvc1t1XSA9ICsrdGltZURGUzsKCiAgICBpZihoZWF2eVt1XSAhPSAtMSkgewogICAgICAgIEhMRChoZWF2eVt1XSwgaCk7CiAgICB9CgogICAgZm9yKGludCB2IDogYWRqW3VdKSB7CiAgICAgICAgaWYodiA9PSBwYXJlbnRbdV0gfHwgdiA9PSBoZWF2eVt1XSkgY29udGludWU7CiAgICAgICAgSExEKHYsIHYpOwogICAgfQp9Cgp2b2lkIGFkZF9wYXRoKGludCB1LCBpbnQgdikgewogICAgd2hpbGUoaGVhZFt1XSAhPSBoZWFkW3ZdKSB7CiAgICAgICAgaWYoZGVwdGhbaGVhZFt1XV0gPCBkZXB0aFtoZWFkW3ZdXSkgc3dhcCh1LCB2KTsKICAgICAgICB1cGRhdGUoMSwgMSwgbiwgcG9zW2hlYWRbdV1dLCBwb3NbdV0sIDEpOwoKICAgICAgICB1ID0gcGFyZW50W2hlYWRbdV1dOwogICAgfQoKICAgIGlmKGRlcHRoW3VdID4gZGVwdGhbdl0pIHN3YXAodSwgdik7CiAgICB1cGRhdGUoMSwgMSwgbiwgcG9zW3VdLCBwb3Nbdl0sIDEpOwp9Cgpsb25nIGxvbmcgZ2V0UGF0aChpbnQgeCkgewogICAgaW50IHUgPSBlZGdlc1t4XS5maXJzdDsKICAgIGludCB2ID0gZWRnZXNbeF0uc2Vjb25kOwogICAgaW50IG5vZGUgPSAoZGVwdGhbdV0gPiBkZXB0aFt2XSA/IHYgOiB1KTsKICAgIHJldHVybiBnZXRTVU0oMSwgMSwgbiwgcG9zW25vZGVdLCBwb3Nbbm9kZV0pOwp9Cgp2b2lkIEluaXQoKSB7CiAgICBjaW4gPj4gbiA+PiBxOwoKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbiAtIDEgOyBpKyspIHsKICAgICAgICBpbnQgdSwgdjsKICAgICAgICBjaW4gPj4gdSA+PiB2OwogICAgICAgIGFkalt1XS5wdXNoX2JhY2sodik7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh1KTsKICAgICAgICBlZGdlcy5wdXNoX2JhY2soe3UsIHZ9KTsKICAgIH0KCiAgICBkZnMoMSwgLTEpOwogICAgSExEKDEsIDEpOwoKICAgIHdoaWxlKHEtLSkgewogICAgICAgIGludCBjaG9vc2U7CiAgICAgICAgY2luID4+IGNob29zZTsKICAgICAgICBpZihjaG9vc2UgPT0gMSkgewogICAgICAgICAgICBpbnQgdSwgdjsKICAgICAgICAgICAgY2luID4+IHUgPj4gdjsKICAgICAgICAgICAgYWRkX3BhdGgodSwgdik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IHg7CiAgICAgICAgICAgIGNpbiA+PiB4OwogICAgICAgICAgICBjb3V0IDw8IGdldFBhdGgoeCkgPDwgeGQ7CiAgICAgICAgfQogICAgfQp9CgpzaWduZWQgbWFpbigpIHsKICAgIEh1dVRoaWVuKCk7CiAgICBJbml0KCk7Cn0=