洛谷60分
是错在很大的数据里。而且是从上万行这里开始错的。错的是第一个,就是 dA+dB−dlca(A,B)+1 这里显示有错,并且我的程序输出是 0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=200009;
ll n,q,son[N],top[N],tI[N],id[N],sz[N],d[N],p[N],x[N],y[N],timer,rt,ky[N],a[N],ans1[N],ans2[N];
vector<ll> to[N],Q[N];
bool ok[N];
struct edge{ll l,r,sum;}tr[4*N];
void buildST(ll x,ll l,ll r){
tr[x]=(edge){l,r,0};
if(l==r) return;
ll mid=(l+r)/2;
buildST(x*2,l,mid);
buildST(x*2+1,mid+1,r);
}
ll query(ll x,ll l,ll r){
if(l<=tr[x].l&&tr[x].r<=r) return tr[x].sum;
if(tr[x].l>r||tr[x].r<l) return 0;
return query(x*2,l,r)+query(x*2+1,l,r);
}
void add(ll x,ll i,ll C){
tr[x].sum+=C;
if(tr[x].l==tr[x].r) return;
i<=tr[x*2].r?add(x*2,i,C):add(x*2+1,i,C);
}
void dfs2(ll x,ll fa){
if(son[fa]==x) top[x]=top[fa];
else top[x]=x;
tI[id[x]=++timer]=x;//tI[x]:线段树->节点 id[x]:节点->线段树
if(son[x]) dfs2(son[x],x);
for(ll i=0,v;i<to[x].size();++i)
if((v=to[x][i])!=fa&&v!=son[x])
dfs2(v,x);
}
void dfs(ll x,ll fa){
sz[x]=1,d[x]=d[fa]+1,p[x]=fa;
for(ll i=0,v;i<to[x].size();++i)
if((v=to[x][i])!=fa){
dfs(v,x),sz[x]+=sz[v];
if(sz[v]>sz[son[x]]) son[x]=v;
}
}
ll qu(ll x){
ll sum=0;
while(x)
sum+=query(1,id[top[x]],id[x]),x=p[top[x]];
return sum;
}
ll lca(ll x,ll y){
while(top[x]^top[y]){
ll&a=(d[top[x]]>d[top[y]]?x:y);
a=p[top[a]];
}
return (d[x]<d[y]?x:y);
}
void ad(ll x){if(!ok[x])add(1,id[x],1);ok[x]=1;}
int main(){
cin>>n;
for(ll i=1;i<=n;++i){
ll x;
cin>>x;
to[x].push_back(i);
if(!x) rt=i;
}
dfs(rt,0);
dfs2(rt,0);
buildST(1,1,n);;
// cout<<"d:\n";
// for(ll i=1;i<=n;++i) cout<<d[i]<<" ";
// cout<<"\n";
// cout<<"id:\n";
// for(ll i=1;i<=n;++i) cout<<id[i]<<" ";
// cout<<"\n";
// cout<<"p:\n";
// for(ll i=1;i<=n;++i) cout<<p[i]<<" ";
// cout<<"\n";
// cout<<"son:\n";
// for(ll i=1;i<=n;++i) cout<<son[i]<<" ";
// cout<<"\n";
// cout<<"sz:\n";
// for(ll i=1;i<=n;++i) cout<<sz[i]<<" ";
// cout<<"\n";
// cout<<"top:\n";
// for(ll i=1;i<=n;++i) cout<<top[i]<<" ";
// cout<<"\n";
// cout<<"tI:\n";
// for(ll i=1;i<=n;++i) cout<<tI[i]<<" ";
// cout<<"\n";
// cout<<"id:\n";
// for(ll i=1;i<=n;++i) cout<<id[i]<<" ";
// cout<<"\n";
cin>>q;ll cntA=0,cntQ=0;
for(ll i=1;i<=q;++i){
ll k;
cin>>k;
if(k==1){
++cntQ;
ll c;
cin>>x[cntQ]>>y[cntQ]>>c;
Q[ky[i-c-1]].push_back(cntQ);
}else{
++cntA;
cin>>a[cntA];
}
ky[i]=cntA;
}
for(ll i=0;i<=cntA;++i){
if(i) ad(a[i]);
// cout<<i<<":";
for(ll j=0,now;j<Q[i].size();++j){
now=Q[i][j];
// cout<<now<<" ";
ll a=x[now],b=y[now],l=lca(a,b);
ans1[now]=d[a]+d[b]-2*d[l]+1,ans2[now]=qu(a)+qu(b)-qu(l)-qu(p[l]);
}
// cout<<"\n";
}
for(ll i=1;i<=cntQ;++i)cout<<ans1[i]<<" "<<ans2[i]<<"\n";
return 0;
}