后面三个死活过不去
#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;
}