1 solutions

  • 0
    @ 2025-11-5 18:08:13

    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