求助卡空间
查看原帖
求助卡空间
331947
hegm楼主2023/3/13 17:18

后面三个死活过不去

#include<bits/stdc++.h>
#define N 150005
#define inf 1000000009
#define lc tr[now].ls
#define rc tr[now].rs
#define ll long long
using namespace std;
int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
	return x*f;
}
int n,q,m,a[N],siz[N],son,sum,num,g[N],dfn[N],dep[N],top[N],bs[N],awa,tp[N],f[N];
bool vis[N];
ll dis[N];
struct fig
{
	int to,next,val;
}k[N*2];int head[N],cnt;
void add(int from,int to,int val)
{
	k[++cnt].to=to;
	k[cnt].next=head[from];
	k[cnt].val=val;
	head[from]=cnt;
}
void dsiz(int now,int fa)
{
	siz[now]=1;
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==fa||vis[k[i].to])continue;
		dsiz(k[i].to,now);
		siz[now]+=siz[k[i].to];
	}
}
void drt(int now,int fa)
{
	int mx=sum-siz[now];
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==fa||vis[k[i].to])continue;
		drt(k[i].to,now);
		mx=max(mx,siz[k[i].to]);
	}
	if(num>mx)son=now,num=mx;
}
struct tree
{
	int ls,rs,num;
	ll val,dt;
}tr[N*106];int tot,rt[N];
void up(int now)
{
	tr[now].val=tr[lc].val+tr[rc].val;
	tr[now].num=tr[lc].num+tr[rc].num;
	tr[now].dt=tr[lc].dt+tr[rc].dt;
}
void add(int now,int l,int r,int x,ll val,ll pos)
{
	if(l==r)
	{
		tr[now].val+=val;
		tr[now].dt+=pos;
		tr[now].num++;
		return ;
	}
	int mid=(l+r)>>1;
	if(mid>=x)
	{
		if(!lc)lc=++tot;
		add(lc,l,mid,x,val,pos);
	}
	else
	{
		if(!rc)rc=++tot;
		add(rc,mid+1,r,x,val,pos);
	}
	up(now);
}
void dfs(int now,int fa)
{
	siz[now]=1;f[now]=fa;dep[now]=dep[fa]+1;
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==fa)continue;
		dis[k[i].to]=dis[now]+k[i].val;
		dfs(k[i].to,now);
		siz[now]+=siz[k[i].to];
		if(siz[bs[now]]<siz[k[i].to])bs[now]=k[i].to;
	}
}
void pf(int now,int fa)
{
	dfn[now]=++awa;tp[now]=fa;
	if(bs[now])pf(bs[now],fa);
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==f[now]||k[i].to==bs[now])continue;
		pf(k[i].to,k[i].to);
	}
}
int lca(int a,int b)
{
	while(tp[a]!=tp[b])
	{
		if(dep[tp[a]]<dep[tp[b]])swap(a,b);
		a=f[tp[a]];
	}
	if(dep[a]>dep[b])swap(a,b);
	return a;
}
ll len(int a,int b)
{
	return dis[a]+dis[b]-2ll*dis[lca(a,b)];
}
ll qnum(int now,int l,int r,int ql,int qr)
{
	if(!now)return 0;
	if(l>=ql&&r<=qr)return tr[now].num;
	int mid=(l+r)>>1,cnt=0;
	if(mid>=ql)cnt+=qnum(lc,l,mid,ql,qr);
	if(mid<qr)cnt+=qnum(rc,mid+1,r,ql,qr);
	return cnt;
}
ll qval(int now,int l,int r,int ql,int qr)
{
	if(!now)return 0;
	if(l>=ql&&r<=qr)return tr[now].val;
	int mid=(l+r)>>1;ll cnt=0;
	if(mid>=ql)cnt+=qval(lc,l,mid,ql,qr);
	if(mid<qr)cnt+=qval(rc,mid+1,r,ql,qr);
	return cnt;
}
ll qdt(int now,int l,int r,int ql,int qr)
{
	if(!now)return 0;
	if(l>=ql&&r<=qr)return tr[now].dt;
	int mid=(l+r)>>1;ll cnt=0;
	if(mid>=ql)cnt+=qdt(lc,l,mid,ql,qr);
	if(mid<qr)cnt+=qdt(rc,mid+1,r,ql,qr);
	return cnt;
}
void dfind(int now,int fa,int pos)
{
	add(rt[pos],0,m,a[now],len(pos,now),len(now,g[pos]));
	for(int i=head[now];i;i=k[i].next)
	{
		if(k[i].to==fa||vis[k[i].to])continue;
		dfind(k[i].to,now,pos);
	}
}
void solve(int now,int fa)
{
	dsiz(now,0);
	son=0;num=inf;sum=siz[now];
	drt(now,0);
	now=son;rt[son]=++tot;
	vis[now]=1;g[now]=fa;
	dfind(now,0,now); 
	for(int i=head[now];i;i=k[i].next)
	{
		if(vis[k[i].to])continue;
		solve(k[i].to,now);
	}
}
ll que(int now,int l,int r)
{
	ll ans=qval(rt[now],0,m,l,r),x=now;
	int last=now;now=g[now];
	while(now!=0)
	{
		ans+=qval(rt[now],0,m,l,r)-qdt(rt[last],0,m,l,r);
		ans+=len(x,now)*(qnum(rt[now],0,m,l,r)-qnum(rt[last],0,m,l,r));
		last=now;now=g[now];
	}
	return ans;
}
signed main()
{
	n=read();q=read();m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	for(int i=1,u,v,w;i<n;i++)
	{
		u=read();v=read();w=read();
		add(u,v,w);add(v,u,w);
	}
	dfs(1,0);
	pf(1,0);
	solve(1,0);
	int u,l,r,ql,qr;
	ll lans=0;
	while(q--)
	{
		u=read();l=read();r=read();
		ql=min((l+lans)%m,(r+lans)%m);
		qr=max((l+lans)%m,(r+lans)%m);
		lans=que(u,ql,qr);
		cout<<lans<<"\n";
	}
	return 0;
}
2023/3/13 17:18
加载中...