1 solutions
-
0
C++ :
#include <bits/stdc++.h> #define bel(x,y) (L[x]>=L[y] && R[x]<=R[y]) using namespace std; long long n,N,IN,m,u,l,r,LOG; long long mer[800001],ls[800001],rs[800001],sum[800001][2],dep[800001],sd[800001][2]; long long fa[800001][20]; long long L[800001],R[800001],nod[800001]; long long lca(long long a,long long b) { if(bel(a,b)) return b; if(bel(b,a)) return a; long long now=a; for(long long i=LOG;i>=0;i--) if(fa[now][i] && !bel(b,fa[now][i])) now=fa[now][i]; return fa[now][0]; } void Dfs(long long now) { if(!ls[now]) return; sum[rs[now]][0]=sum[now][0]; sum[rs[now]][1]=sum[now][1]+1; sum[ls[now]][0]=sum[now][0]+1; sum[ls[now]][1]=sum[now][1]; dep[ls[now]]=dep[now]+1; dep[rs[now]]=dep[now]+1; sd[rs[now]][0]=sd[now][0]; sd[rs[now]][1]=sd[now][1]+dep[now]+1; sd[ls[now]][0]=sd[now][0]+dep[now]+1; sd[ls[now]][1]=sd[now][1]; Dfs(ls[now]); Dfs(rs[now]); } long long dfs(long long l,long long r) { long long now=++N; L[now]=l;R[now]=r; for(long long i=0;fa[fa[now][i]][i];i++) fa[now][i+1]=fa[fa[now][i]][i]; if(l==r) return nod[l]=now; long long me=mer[IN++]; fa[N+1][0]=now; ls[now]=dfs(l,me); fa[N+1][0]=now; rs[now]=dfs(me+1,r); return now; } long long getl(long long l) { long long lc=lca(l,u); long long now=dep[lc]*(sum[l][0]-sum[lc][0])+(bel(l,ls[lc]) && lc!=u)+sd[lc][0]-sum[lc][0]; long long ans=sd[l][0]+sum[l][0]*dep[u]-now*2; return ans; } long long getr(long long r) { long long lc=lca(r,u); long long now=dep[lc]*(sum[r][1]-sum[lc][1])+(bel(r,rs[lc]) && lc!=u)+sd[lc][1]-sum[lc][1]; long long ans=sd[r][1]+sum[r][1]*dep[u]-now*2; return ans; } int main() { scanf("%d",&n); for(long long i=1;i<=n;i<<=1) LOG++; for(long long i=1;i<n;i++) scanf("%d",&mer[i]); IN=1; dfs(1,n); Dfs(1); scanf("%d",&m); for(long long i=1;i<=m;i++) { scanf("%d%d%d",&u,&l,&r); --l;++r; if(!l && r>n) { printf("%d\n",dep[u]); continue; } long long ans=0; if(l) ans+=getl(nod[l])-((r<=n)?getl(ls[lca(nod[l],nod[r])]):0); if(r<=n) ans+=getr(nod[r])-(l?getr(rs[lca(nod[l],nod[r])]):0); printf("%lld\n",ans); } return 0; }
- 1
Information
- ID
- 18796
- Time
- 2000ms
- Memory
- 512MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By