Wa on #1234,悬关
查看原帖
Wa on #1234,悬关
964973
withyan楼主2023/6/11 21:37
#include<bits/stdc++.h>

using namespace std;

typedef long long LL;

const int N=200100,mod=201314;
int e[2*N],ne[2*N],h[N],idx,w[N],cnt;
int fa[N],dep[N],son[N],top[N],siz[N],id[N];
struct Q
{
    int ed,z,id,sg;
}q[2*N];
struct Yan
{
    int l,r;
    LL sum;
    LL add;
}tr[N*4];
int n,qq;
LL ans[N*2];
void add(int a,int b)
{
    e[idx]=b,ne[idx]=h[a],h[a]=idx++;
}
void dfs1(int u,int pa)
{
	siz[u]=1;
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==pa) continue;
		dep[j]=dep[u]+1,fa[j]=u;
		dfs1(j,u);
		siz[u]+=siz[j];
		if(siz[j]>siz[son[u]]) son[u]=j;
	}
	return;
}
void dfs2(int u,int t)
{
	top[u]=t,id[u]=++cnt;
	if(son[u]) dfs2(son[u],t);
	for(int i=h[u];~i;i=ne[i])
	{
		int j=e[i];
		if(j==fa[u]||j==son[u]) continue;
		dfs2(j,j);
	}
	return;
}
void pushup(Yan &u,Yan &l,Yan &r)
{
    u.sum=(l.sum+r.sum)%mod;
    return;
}
void pushup(int u)
{
    pushup(tr[u],tr[u<<1],tr[u<<1|1]);
    return;
}
void pushdown(Yan &u,Yan &l,Yan &r)
{
    if(u.add)
    {
        l.sum=(l.sum+u.add*(l.r-l.l+1)%mod)%mod;
        r.sum=(r.sum+u.add*(r.r-r.l+1)%mod)%mod;
        l.add=(l.add+u.add)%mod;
        r.add=(r.add+u.add)%mod;
        u.add=0;
    }
    return;
}
void pushdown(int u)
{
    pushdown(tr[u],tr[u<<1],tr[u<<1|1]);
    return;
}
void build(int u,int l,int r)
{
    tr[u]={l,r,0,0};
    if(l==r) return;
    int mid=(l+r)>>1;
    build(u<<1,l,mid),build(u<<1|1,mid+1,r);
    pushup(u);
}
LL query(int u,int l,int r)
{
	if(tr[u].l>=l&&tr[u].r<=r) return tr[u].sum%mod;
	pushdown(u);
	int mid=(tr[u].l+tr[u].r)>>1;
	LL res=0;
	if(l<=mid) res=(res+query(u<<1,l,r))%mod;
	if(r>mid) res=(res+query(u<<1|1,l,r))%mod;
	return res%mod;
}
void modify(int u,int l,int r,int v)
{
	if(tr[u].l>=l&&tr[u].r<=r) 
		tr[u].add=(tr[u].add+v)%mod,
		tr[u].sum=(tr[u].sum+(tr[u].r-tr[u].l+1)*v%mod)%mod;
	else 
	{
		pushdown(u);
		int mid=(tr[u].l+tr[u].r)>>1;
		if(l<=mid) modify(u<<1,l,r,v);
		if(r>mid) modify(u<<1|1,l,r,v);
		pushup(u);
	}
	return;
}
void modifypath(int x,int y)
{
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		modify(1,id[top[x]],id[x],1);
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	modify(1,id[x],id[y],1);
	return;
}
LL querypath(int x,int y)
{
	LL ans=0;
	while(top[x]!=top[y])
	{
		if(dep[top[x]]<dep[top[y]]) swap(x,y);
		ans+=query(1,id[top[x]],id[x]);
		ans%=mod;
		x=fa[top[x]];
	}
	if(dep[x]>dep[y]) swap(x,y);
	ans+=query(1,id[x],id[y]);
	return ans%mod;
}
bool cmp(Q &a,Q &b)
{
	return a.ed<b.ed;
}
int main()
{
    memset(h,-1,sizeof h);
    scanf("%d%d",&n,&qq);
    for(int i=2;i<=n;i++)
    {
        int x;
        scanf("%d",&x);
        x++;
        add(i,x),add(x,i);
    }
    int tot=0;
    for(int i=1;i<=qq;i++)
    {
        int l,r,z;
        scanf("%d%d%d",&l,&r,&z);
        z++;
        q[++tot]={l,z,i,0};
        q[++tot]={r+1,z,i,1};
    }
    dfs1(1,0);
    dfs2(1,1);
    build(1,1,n);
    sort(q+1,q+tot+1,cmp);
    int s=1;
    for(int i=1;i<=tot;i++)
    {
        while(s<=q[i].ed) modifypath(1,s++);
        LL tha=querypath(1,q[i].z);
//		printf("%d %d %d\n",q[i].id,s,tha);
        if(q[i].sg) ans[q[i].id]=(ans[q[i].id]+tha)%mod;
        else ans[q[i].id]=(ans[q[i].id]-tha)%mod;
    }
    for(int i=1;i<=qq;i++)
        printf("%lld\n",ans[i]);
    return 0;
}
2023/6/11 21:37
加载中...