#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define int long long
const int N=2e5+5;
int n,q,s[N],heavy[N],root[N],dep[N],par[N],sz[N],pos[N],timer;
vector<int>adj[N];
void dfs_size(int node,int p)
{
par[node]=p;
dep[node]=dep[p]+1;
sz[node]=1;
int bigc=-1,bigv=-1;
for(auto it:adj[node])
{
if(it!=p)
{
dfs_size(it,node);
sz[node]+=sz[it];
if(sz[it]>bigv)
{
bigv=sz[it];
bigc=it;
}
}
}
heavy[node]=bigc;
}
void dfs_positions(int node,int p)
{
pos[node]=timer++;
if(~heavy[node])
{
dfs_positions(heavy[node],node);
}
for(auto it:adj[node])
{
if(it!=p&&it!=heavy[node])
{
dfs_positions(it,node);
}
}
}
void dfs_chain(int node,int p)
{
if(~heavy[node])
{
root[heavy[node]]=root[node];
}
for(auto it:adj[node])
{
if(it!=p)
{
dfs_chain(it,node);
}
}
}
void init()
{
iota(root,root+N,0);
memset(heavy,-1,sizeof heavy);
dfs_size(1,0);
dfs_chain(1,0);
dfs_positions(1,0);
}
struct SegmentTree{
private:
#define L 2*node+1
#define R 2*node+2
#define mid (l+r>>1)
struct Node{
ll cnt,inc;
Node(){}
Node(ll b,ll c):cnt(b),inc(c){}
};
ll sum(ll n)
{
return n*(n+1)/2;
}
int sz;vector<ll>seg;vector<Node>lazy;
void propegate(int l,int r,int node)
{
if(lazy[node].cnt==0) return;
if(l!=r)
{
lazy[L].cnt+=lazy[node].cnt;
lazy[L].inc+=lazy[node].inc;
lazy[R].cnt+=lazy[node].cnt+(mid-l+1)*lazy[node].inc;
lazy[R].inc+=lazy[node].inc;
}
ll len=r-l+1;
seg[node]+=lazy[node].cnt*len;
seg[node]+=lazy[node].inc*sum(len-1);
lazy[node]=Node(0,0);
}
void add(int l,int r,int node,int lx,int rx,ll start,ll zeyada)
{
propegate(l,r,node);
if(l>rx||r<lx)
{
return;
}
if(l>=lx&&r<=rx)
{
lazy[node].inc+=zeyada;
lazy[node].cnt+=start+(l-lx)*zeyada;
propegate(l,r,node);
return;
}
add(l,mid,L,lx,rx,start,zeyada);
add(mid+1,r,R,lx,rx,start,zeyada);
seg[node]=seg[L]+seg[R];
}
ll query(int l,int r,int node,int lx,int rx)
{
propegate(l,r,node);
if(l>rx||r<lx)
{
return 0;
}
if(l>=lx&&r<=rx)
{
return seg[node];
}
return query(l,mid,L,lx,rx)+query(mid+1,r,R,lx,rx);
}
public:
SegmentTree(int n)
{
sz=1;
while(sz<n)
{
sz<<=1;
}
seg=vector<ll>(sz<<1);
lazy=vector<Node>(sz<<1,Node(0,0));
}
void add(int l,int r,ll start,ll zeyada)
{
add(0,sz-1,0,l,r,start,zeyada);
}
ll query(int l,int r)
{
return query(0,sz-1,0,l,r);
}
#undef L
#undef R
#undef mid
}tree(N);
int dis(int u,int v)
{
ll ret=0;
while(root[u]!=root[v])
{
if(dep[root[u]]>dep[root[v]])
{
swap(u,v);
}
ret+=pos[root[v]]-pos[v]+1;
v=par[root[v]];
}
if(dep[u]>dep[v])
{
swap(u,v);
}
ret+=pos[v]-pos[u]+1;
return ret;
}
void update(int u,int v)
{
int L=1,R=dis(u,v);
while(root[u]!=root[v])
{
if(dep[root[u]]>dep[root[v]])
{
int len=pos[u]-pos[root[u]]+1;
tree.add(pos[root[u]],pos[u],L,1);
L+=len;
u=par[root[u]];
}
else
{
int len=pos[v]-pos[root[v]]+1;
tree.add(pos[root[v]],pos[v],R,-1);
R-=len;
v=par[root[v]];
}
}
if(dep[u]>dep[v])
{
tree.add(pos[v],pos[u],R,-1);
}
else
{
tree.add(pos[u],pos[v],L,1);
}
} // في شغل هنا
int query(int u,int v)
{
ll ret=0;
while(root[u]!=root[v])
{
if(dep[root[u]]>dep[root[v]])
{
swap(u,v);
}
ret+=tree.query(pos[root[v]],pos[v]);
v=par[root[v]];
}
if(dep[u]>dep[v])
{
swap(u,v);
}
ret+=tree.query(pos[u],pos[v]);
return ret;
}
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n;
for(int i=0;i<n-1;i++)
{
int a,b;cin>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
init();
cin>>q;while(q--)
{
int op;cin>>op;
if(op==1)
{
int u,v;cin>>u>>v;
update(u,v);
}
else if(op==2)
{
int u,v;cin>>u>>v;
cout<<query(u,v)<<'\n';
}
}
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBpbnQgbG9uZyBsb25nCmNvbnN0IGludCBOPTJlNSs1OwppbnQgbixxLHNbTl0saGVhdnlbTl0scm9vdFtOXSxkZXBbTl0scGFyW05dLHN6W05dLHBvc1tOXSx0aW1lcjsKdmVjdG9yPGludD5hZGpbTl07CnZvaWQgZGZzX3NpemUoaW50IG5vZGUsaW50IHApCnsKICAgIHBhcltub2RlXT1wOwogICAgZGVwW25vZGVdPWRlcFtwXSsxOwogICAgc3pbbm9kZV09MTsKICAgIGludCBiaWdjPS0xLGJpZ3Y9LTE7CiAgICBmb3IoYXV0byBpdDphZGpbbm9kZV0pCiAgICB7CiAgICAgICAgaWYoaXQhPXApCiAgICAgICAgewogICAgICAgICAgICBkZnNfc2l6ZShpdCxub2RlKTsKICAgICAgICAgICAgc3pbbm9kZV0rPXN6W2l0XTsKICAgICAgICAgICAgaWYoc3pbaXRdPmJpZ3YpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGJpZ3Y9c3pbaXRdOwogICAgICAgICAgICAgICAgYmlnYz1pdDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGhlYXZ5W25vZGVdPWJpZ2M7Cn0Kdm9pZCBkZnNfcG9zaXRpb25zKGludCBub2RlLGludCBwKQp7CiAgICBwb3Nbbm9kZV09dGltZXIrKzsKICAgIGlmKH5oZWF2eVtub2RlXSkKICAgIHsKICAgICAgICBkZnNfcG9zaXRpb25zKGhlYXZ5W25vZGVdLG5vZGUpOwogICAgfQogICAgZm9yKGF1dG8gaXQ6YWRqW25vZGVdKQogICAgewogICAgICAgIGlmKGl0IT1wJiZpdCE9aGVhdnlbbm9kZV0pCiAgICAgICAgewogICAgICAgICAgICBkZnNfcG9zaXRpb25zKGl0LG5vZGUpOwogICAgICAgIH0KICAgIH0KfQp2b2lkIGRmc19jaGFpbihpbnQgbm9kZSxpbnQgcCkKewogICAgaWYofmhlYXZ5W25vZGVdKQogICAgewogICAgICAgIHJvb3RbaGVhdnlbbm9kZV1dPXJvb3Rbbm9kZV07CiAgICB9CiAgICBmb3IoYXV0byBpdDphZGpbbm9kZV0pCiAgICB7CiAgICAgICAgaWYoaXQhPXApCiAgICAgICAgewogICAgICAgICAgICBkZnNfY2hhaW4oaXQsbm9kZSk7CiAgICAgICAgfQogICAgfQp9CnZvaWQgaW5pdCgpCnsKICAgIGlvdGEocm9vdCxyb290K04sMCk7CiAgICBtZW1zZXQoaGVhdnksLTEsc2l6ZW9mIGhlYXZ5KTsKICAgIGRmc19zaXplKDEsMCk7CiAgICBkZnNfY2hhaW4oMSwwKTsKICAgIGRmc19wb3NpdGlvbnMoMSwwKTsKfQpzdHJ1Y3QgU2VnbWVudFRyZWV7CnByaXZhdGU6CiNkZWZpbmUgTCAyKm5vZGUrMQojZGVmaW5lIFIgMipub2RlKzIKI2RlZmluZSBtaWQgKGwrcj4+MSkKICAgIHN0cnVjdCBOb2RlewogICAgICAgIGxsIGNudCxpbmM7CiAgICAgICAgTm9kZSgpe30KICAgICAgICBOb2RlKGxsIGIsbGwgYyk6Y250KGIpLGluYyhjKXt9CiAgICB9OwogICAgbGwgc3VtKGxsIG4pCiAgICB7CiAgICAgICAgcmV0dXJuIG4qKG4rMSkvMjsKICAgIH0KICAgIGludCBzejt2ZWN0b3I8bGw+c2VnO3ZlY3RvcjxOb2RlPmxhenk7CiAgICB2b2lkIHByb3BlZ2F0ZShpbnQgbCxpbnQgcixpbnQgbm9kZSkKICAgIHsKICAgICAgICBpZihsYXp5W25vZGVdLmNudD09MCkgcmV0dXJuOwogICAgICAgIGlmKGwhPXIpCiAgICAgICAgewogICAgICAgICAgICBsYXp5W0xdLmNudCs9bGF6eVtub2RlXS5jbnQ7CiAgICAgICAgICAgIGxhenlbTF0uaW5jKz1sYXp5W25vZGVdLmluYzsKICAgICAgICAgICAgbGF6eVtSXS5jbnQrPWxhenlbbm9kZV0uY250KyhtaWQtbCsxKSpsYXp5W25vZGVdLmluYzsKICAgICAgICAgICAgbGF6eVtSXS5pbmMrPWxhenlbbm9kZV0uaW5jOwogICAgICAgIH0KICAgICAgICBsbCBsZW49ci1sKzE7CiAgICAgICAgc2VnW25vZGVdKz1sYXp5W25vZGVdLmNudCpsZW47CiAgICAgICAgc2VnW25vZGVdKz1sYXp5W25vZGVdLmluYypzdW0obGVuLTEpOwogICAgICAgIGxhenlbbm9kZV09Tm9kZSgwLDApOwogICAgfQogICAgdm9pZCBhZGQoaW50IGwsaW50IHIsaW50IG5vZGUsaW50IGx4LGludCByeCxsbCBzdGFydCxsbCB6ZXlhZGEpCiAgICB7CiAgICAgICAgcHJvcGVnYXRlKGwscixub2RlKTsKICAgICAgICBpZihsPnJ4fHxyPGx4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZihsPj1seCYmcjw9cngpCiAgICAgICAgewogICAgICAgICAgICBsYXp5W25vZGVdLmluYys9emV5YWRhOwogICAgICAgICAgICBsYXp5W25vZGVdLmNudCs9c3RhcnQrKGwtbHgpKnpleWFkYTsKICAgICAgICAgICAgcHJvcGVnYXRlKGwscixub2RlKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBhZGQobCxtaWQsTCxseCxyeCxzdGFydCx6ZXlhZGEpOwogICAgICAgIGFkZChtaWQrMSxyLFIsbHgscngsc3RhcnQsemV5YWRhKTsKICAgICAgICBzZWdbbm9kZV09c2VnW0xdK3NlZ1tSXTsKICAgIH0KICAgIGxsIHF1ZXJ5KGludCBsLGludCByLGludCBub2RlLGludCBseCxpbnQgcngpCiAgICB7CiAgICAgICAgcHJvcGVnYXRlKGwscixub2RlKTsKICAgICAgICBpZihsPnJ4fHxyPGx4KQogICAgICAgIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIGlmKGw+PWx4JiZyPD1yeCkKICAgICAgICB7CiAgICAgICAgICAgIHJldHVybiBzZWdbbm9kZV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBxdWVyeShsLG1pZCxMLGx4LHJ4KStxdWVyeShtaWQrMSxyLFIsbHgscngpOwogICAgfQpwdWJsaWM6CiAgICBTZWdtZW50VHJlZShpbnQgbikKICAgIHsKICAgICAgICBzej0xOwogICAgICAgIHdoaWxlKHN6PG4pCiAgICAgICAgewogICAgICAgICAgICBzejw8PTE7CiAgICAgICAgfQogICAgICAgIHNlZz12ZWN0b3I8bGw+KHN6PDwxKTsKICAgICAgICBsYXp5PXZlY3RvcjxOb2RlPihzejw8MSxOb2RlKDAsMCkpOwogICAgfQogICAgdm9pZCBhZGQoaW50IGwsaW50IHIsbGwgc3RhcnQsbGwgemV5YWRhKQogICAgewogICAgICAgIGFkZCgwLHN6LTEsMCxsLHIsc3RhcnQsemV5YWRhKTsKICAgIH0KICAgIGxsIHF1ZXJ5KGludCBsLGludCByKQogICAgewogICAgICAgIHJldHVybiBxdWVyeSgwLHN6LTEsMCxsLHIpOwogICAgfQojdW5kZWYgTAojdW5kZWYgUgojdW5kZWYgbWlkCn10cmVlKE4pOwppbnQgZGlzKGludCB1LGludCB2KQp7CiAgICBsbCByZXQ9MDsKICAgIHdoaWxlKHJvb3RbdV0hPXJvb3Rbdl0pCiAgICB7CiAgICAgICAgaWYoZGVwW3Jvb3RbdV1dPmRlcFtyb290W3ZdXSkKICAgICAgICB7CiAgICAgICAgICAgIHN3YXAodSx2KTsKICAgICAgICB9CiAgICAgICAgcmV0Kz1wb3Nbcm9vdFt2XV0tcG9zW3ZdKzE7CiAgICAgICAgdj1wYXJbcm9vdFt2XV07CiAgICB9CiAgICBpZihkZXBbdV0+ZGVwW3ZdKQogICAgewogICAgICAgIHN3YXAodSx2KTsKICAgIH0KICAgIHJldCs9cG9zW3ZdLXBvc1t1XSsxOwogICAgcmV0dXJuIHJldDsKfQp2b2lkIHVwZGF0ZShpbnQgdSxpbnQgdikKewogICAgaW50IEw9MSxSPWRpcyh1LHYpOwogICAgd2hpbGUocm9vdFt1XSE9cm9vdFt2XSkKICAgIHsKICAgICAgICBpZihkZXBbcm9vdFt1XV0+ZGVwW3Jvb3Rbdl1dKQogICAgICAgIHsKICAgICAgICAgICAgaW50IGxlbj1wb3NbdV0tcG9zW3Jvb3RbdV1dKzE7CiAgICAgICAgICAgIHRyZWUuYWRkKHBvc1tyb290W3VdXSxwb3NbdV0sTCwxKTsKICAgICAgICAgICAgTCs9bGVuOwogICAgICAgICAgICB1PXBhcltyb290W3VdXTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaW50IGxlbj1wb3Nbdl0tcG9zW3Jvb3Rbdl1dKzE7CiAgICAgICAgICAgIHRyZWUuYWRkKHBvc1tyb290W3ZdXSxwb3Nbdl0sUiwtMSk7CiAgICAgICAgICAgIFItPWxlbjsKICAgICAgICAgICAgdj1wYXJbcm9vdFt2XV07CiAgICAgICAgfQogICAgfQogICAgaWYoZGVwW3VdPmRlcFt2XSkKICAgIHsKICAgICAgICB0cmVlLmFkZChwb3Nbdl0scG9zW3VdLFIsLTEpOwogICAgfQogICAgZWxzZQogICAgewogICAgICAgIHRyZWUuYWRkKHBvc1t1XSxwb3Nbdl0sTCwxKTsKICAgIH0KfSAvLyDZgdmKINi02LrZhCDZh9mG2KcKaW50IHF1ZXJ5KGludCB1LGludCB2KQp7CiAgICBsbCByZXQ9MDsKICAgIHdoaWxlKHJvb3RbdV0hPXJvb3Rbdl0pCiAgICB7CiAgICAgICAgaWYoZGVwW3Jvb3RbdV1dPmRlcFtyb290W3ZdXSkKICAgICAgICB7CiAgICAgICAgICAgIHN3YXAodSx2KTsKICAgICAgICB9CiAgICAgICAgcmV0Kz10cmVlLnF1ZXJ5KHBvc1tyb290W3ZdXSxwb3Nbdl0pOwogICAgICAgIHY9cGFyW3Jvb3Rbdl1dOwogICAgfQogICAgaWYoZGVwW3VdPmRlcFt2XSkKICAgIHsKICAgICAgICBzd2FwKHUsdik7CiAgICB9CiAgICByZXQrPXRyZWUucXVlcnkocG9zW3VdLHBvc1t2XSk7CiAgICByZXR1cm4gcmV0Owp9CnNpZ25lZCBtYWluKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbygwKTtjaW4udGllKDApO2NvdXQudGllKDApOwogICAgY2luPj5uOwogICAgZm9yKGludCBpPTA7aTxuLTE7aSsrKQogICAgewogICAgICAgIGludCBhLGI7Y2luPj5hPj5iOwogICAgICAgIGFkalthXS5wdXNoX2JhY2soYik7CiAgICAgICAgYWRqW2JdLnB1c2hfYmFjayhhKTsKICAgIH0KICAgIGluaXQoKTsKICAgIGNpbj4+cTt3aGlsZShxLS0pCiAgICB7CiAgICAgICAgaW50IG9wO2Npbj4+b3A7CiAgICAgICAgaWYob3A9PTEpCiAgICAgICAgewogICAgICAgICAgICBpbnQgdSx2O2Npbj4+dT4+djsKICAgICAgICAgICAgdXBkYXRlKHUsdik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYob3A9PTIpCiAgICAgICAgewogICAgICAgICAgICBpbnQgdSx2O2Npbj4+dT4+djsKICAgICAgICAgICAgY291dDw8cXVlcnkodSx2KTw8J1xuJzsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQ==