记录编号 613895 评测结果 AAAAAAAAAA
题目名称 1960.[HNOI 2015]开店 最终得分 100
用户昵称 GravatarRpUtl 是否通过 通过
代码语言 C++ 运行时间 11.087 s
提交时间 2026-04-01 18:04:34 内存使用 79.56 MiB
显示代码纯文本
#include <bits/stdc++.h>
#define mp make_pair
#define fi first
#define se second
using namespace std;
const int N=2e5+10;
typedef long long ll;
int n,q,A,rt,siz[N],mx[N],t[N],fa[N],vis[N];
vector<pair<int,int>>G[N];
int dfn[N],cnt,f[N],logn[N],st[N][21];
ll de[N];int deep[N];
void dfslca(int x,int par){
	dfn[x]=++cnt;deep[x]=deep[par]+1;
	st[dfn[x]][0]=x,f[x]=par;
	for(auto [y,z]:G[x]){
		if(y==f[x])continue;
		de[y]=de[x]+z;
		dfslca(y,x);
	}
	return;
}
#define cmp(a,b) (deep[a]<deep[b]?a:b)
int LCA(int a,int b){
	if(a==b)return a;
	if((a=dfn[a])>(b=dfn[b]))swap(a,b);
	a++;int d=logn[b-a+1];
	return f[cmp(st[a][d],st[b-(1<<d)+1][d])];
}
void init(){
	logn[0]=-1;
	for(int i=1;i<=n;i++)logn[i]=logn[i/2]+1;
	for(int j=1;j<=20;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			st[i][j]=cmp(st[i][j-1],st[i+(1<<j-1)][j-1]);
		}
	}
	return;
}
ll dis(int a,int b){
	int c=LCA(a,b);
	return de[a]+de[b]-2*de[c];
}
struct DS{
	vector<int>p;
	int len,L,R;
	vector<ll>sum[2];
	void ins(int x){
		p.push_back(x);
		len++;
	}
	void init(int pos){
		sort(p.begin(),p.end(),[&](int u,int v){
			return t[u]<t[v];
		});
		sum[0].resize(len);
		for(int i=0;i<len;i++){
			sum[0][i]=dis(p[i],pos);
			if(i)sum[0][i]+=sum[0][i-1];
		}
		if(fa[pos]){
			sum[1].resize(len);
			for(int i=0;i<len;i++){
				sum[1][i]=dis(p[i],fa[pos]);
				if(i)sum[1][i]+=sum[1][i-1];
			}
		}
		for(int i=0;i<len;i++)p[i]=t[p[i]];
		return;
	}
	ll ask(int l,int r,int o,ll &cnt){
		if(!len)return cnt=0;
		L=lower_bound(p.begin(),p.end(),l)-p.begin();
		R=upper_bound(p.begin(),p.end(),r)-p.begin()-1;
		if(R<0)return cnt=0;
		cnt=R-L+1;return sum[o][R]-(L?sum[o][L-1]:0); 
	}
}tr[N];
void add(int x,int y,int z){
	G[x].push_back(mp(y,z));
}
void DFS(int x,int par,int tp){
	tr[tp].ins(x);
	for(auto [y,z]:G[x]){
		if(y==par||vis[y])continue;
		DFS(y,x,tp);
	}
	return;
}
void dfs(int x,int par,int sum){
	siz[x]=1,mx[x]=0;
	for(auto [y,z]:G[x]){
		if(y==par||vis[y])continue;
		dfs(y,x,sum);
		siz[x]+=siz[y];
		mx[x]=max(mx[x],siz[y]);
	}
	mx[x]=max(mx[x],sum-siz[x]);
	if(mx[x]<mx[rt])rt=x;
	return;
}
void solve(int u,int sum){
	vis[u]=1;
	tr[u].ins(u);
	for(auto [v,w]:G[u]){
		if(vis[v])continue;
		DFS(v,u,u);
	}
	for(auto [v,w]:G[u]){
		if(vis[v])continue;
		int sz=(siz[v]>siz[u]?sum-siz[u]:siz[v]);
		rt=0,dfs(v,u,sz);fa[rt]=u;
		solve(rt,sz);
	}
	tr[u].init(u);
	return;
}

int main(){
	freopen("shop_hnoi2015.in","r",stdin);
	freopen("shop_hnoi2015.out","w",stdout);
	scanf("%d %d %d",&n,&q,&A);
	for(int i=1;i<=n;i++)scanf("%d",t+i);
	for(int i=1,u,v,w;i<n;i++){
		scanf("%d %d %d",&u,&v,&w);
		add(u,v,w),add(v,u,w);
	}
	dfslca(1,0);
	init();
	mx[0]=1e9,rt=0;
	dfs(1,0,n);
	solve(rt,n);
	int u,l,r;
	ll ans=0,c1,c2;
	while(q--){
		scanf("%d %d %d",&u,&l,&r);
		l=(l+ans)%A,r=(r+ans)%A;
		if(l>r)swap(l,r);
		ans=tr[u].ask(l,r,0,c1);
		for(int v=u;fa[v];v=fa[v]){
			ans+=tr[fa[v]].ask(l,r,0,c1)-tr[v].ask(l,r,1,c2);
			ans+=(c1-c2)*dis(u,fa[v]);
		}
		printf("%lld\n",ans);
	}
	return 0;
}