loj的提交记录
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#define int long long
const int N=1e5+5e4+10;
int n,m,A,tot=0,head[N],val[N];
struct edge{int nex,go,wt;}g[N<<1];
void add(int x,int y,int v) {
g[++tot]=(edge){head[x],y,v};
head[x]=tot;
}
int read() {
int x=0,minus=0; char ch;
while (!isdigit(ch=getchar())) minus|=(ch=='-');
while (isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
return minus?-x:x;
}
int max(int x,int y) {return x>y?x:y;}
int min(int x,int y) {return x<y?x:y;}
void swap(int &x,int &y) {int tmp=x; x=y; y=tmp;}
bool vis[N];
int sum,rt,sz[N],dp[N];
void get_rt(int x,int f) {
sz[x]=1; dp[x]=0;
for (int i=head[x];i;i=g[i].nex) {
int y=g[i].go;
if (y==f||vis[y]) continue;
get_rt(y,x);
sz[x]+=sz[y];
dp[x]=max(dp[x],sz[y]);
}
dp[x]=max(dp[x],sum-sz[x]);
if (dp[x]<dp[rt]) rt=x;
}
struct emt{int age,pos;};
bool cmp(emt x,emt y) {return x.age<y.age;}
int dep[N],dis[N][19],fa[N];
struct jgll {
int Max;
std::vector<int >ans[2];
std::vector<emt >msg;
void start(int anc) {
Max=msg.size();
std::sort(msg.begin(),msg.end(),cmp);
for (int i=0;i<Max;++i) {
int x=msg[i].pos;
ans[0].push_back(dis[x][dep[anc]]);
ans[1].push_back(dis[x][dep[fa[anc]]]);
}
for (int i=1;i<Max;++i) ans[0][i]+=ans[0][i-1],ans[1][i]+=ans[1][i-1];
}
int get_sml(int x) {
int l=0,r=Max-1,res=Max;
while (l<=r) {
int mid=(l+r)>>1;
if (msg[mid].age<x) l=mid+1;
else r=mid-1,res=mid;
}
return res;
}
int get_big(int x) {
int l=0,r=Max-1,res=-1;
while (l<=r) {
int mid=(l+r)>>1;
if (msg[mid].age>x) r=mid-1;
else l=mid+1,res=mid;
}
return res;
}
int get_ans(int d,int L,int R,int id) {
L=get_sml(L); R=get_big(R);
if (L>R) return 0;
if (L==0) return d*(R+1)+ans[id][R];
return d*(R-L+1)+ans[id][R]-ans[id][L-1];
}
}tr[N];
void get_dis(int x,int f,int d,int anc) {
dis[x][dep[anc]]=d;
tr[anc].msg.push_back((emt){val[x],x});
for (int i=head[x];i;i=g[i].nex) {
int y=g[i].go;
if (y==f||vis[y]) continue;
get_dis(y,x,d+g[i].wt,anc);
}
}
void solve(int x,int f) {
dep[x]=dep[f]+1; vis[x]=true;
fa[x]=f; get_dis(x,f,0,x);
for (int i=head[x];i;i=g[i].nex) {
int y=g[i].go;
if (vis[y]) continue;
sum=sz[y]; rt=0;
get_rt(y,x); solve(rt,x);
}
}
int work(int x,int L,int R,int res=0) {
int xx=x;
res=tr[xx].get_ans(0,L,R,0);
while (fa[x]) {
int d=dis[xx][dep[fa[x]]];
res+=tr[fa[x]].get_ans(d,L,R,0);
res-=tr[x].get_ans(d,L,R,1);
x=fa[x];
}
return res;
}
signed main() {
n=read(),m=read(),A=read();
for (int i=1;i<=n;++i) val[i]=read()%A;
for (int i=1;i<n;++i) {
int x=read(),y=read(),v=read();
add(x,y,v); add(y,x,v);
}
sum=dp[0]=n; rt=0;
get_rt(1,0); solve(rt,0);
for (int i=1;i<=n;++i) tr[i].start(i);
int last=0;
while (m--) {
int x=read(),L=read(),R=read();
L=(L+last)%A; R=(R+last)%A;
if (L>R) swap(L,R);
printf("%lld\n",last=work(x,L,R));
}
return 0;
}