rt 样例没过 懒得调了
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
void Freopen() {
freopen("", "r", stdin);
freopen("", "w", stdout);
}
using namespace std;
const int N = 2e5 + 10, M = 2e5 + 10, inf = 1e9, mod = 998244353;
int read( int x = 0) { return cin >> x, x; }
int n, Q, A;
int a[N], ind[N];
vector< pair< int, int> > G[N];
int dis[N], dep[N], son[N], fa[N], siz[N];
void dfs1( int u, int fu) {
dep[u] = dep[fu] + 1, fa[u] = fu, siz[u] = 1;
for ( auto i : G[u]) {
int v = i.first;
if (v == fu) continue ;
dis[v] = dis[u] + i.second;
dfs1(v, u);
siz[u] += siz[v];
son[u] = (siz[son[u]] < siz[v] ? v : son[u]);
}
}
int top[N];
void dfs2( int u, int topt) {
top[u] = topt;
if (son[u]) dfs2(son[u], topt);
for ( auto i : G[u])
if (i.first != fa[u] && i.first != son[u])
dfs2(i.first, i.first);
}
int lca( int u, int v) {
int tu = top[u], tv = top[v];
while (tu != tv) {
if (dep[tu] < dep[tv]) swap(tu, tv), swap(u, v);
u = fa[tu], tu = top[u];
}
return dep[u] < dep[v] ? u : v;
}
int Dis( int u, int v) {
return dis[u] + dis[v] - 2 * dis[lca(u, v)];
}
struct node {
int root;
int siz[N], fa[N], vis[N], mx[N];
void init() {
root = 0;
memset(siz, 0, sizeof siz);
memset(fa, 0, sizeof fa);
memset(vis, 0, sizeof vis);
memset(mx, 0, sizeof mx);
}
void getsiz( int u, int fu) {
siz[u] = 1;
int v;
for ( auto i : G[u])
if ((v = i.first) != fu && ! vis[v])
getsiz(v, u), siz[u] += siz[v];
}
void getrt( int u, int fu, int sum, int & rt) {
mx[u] = 0;
int v;
for ( auto i : G[u])
if ((v = i.first) != fu && ! vis[v])
getrt(v, u, sum, rt), mx[u] = max(mx[u], siz[v]);
mx[u] = max(mx[u], sum - siz[u]);
if (mx[u] <= sum / 2) rt = u;
}
int build( int u) {
getsiz(u, 0);
int rt = 0, v;
getrt(u, 0, siz[u], rt);
vis[rt] = 1;
for ( auto i : G[rt])
if (! vis[(v = i.first)])
fa[build(v)] = rt;
return rt;
}
} S;
int sum[N * 70], ls[N * 70], rs[N * 70];
int tot;
void ins( int & k, int l, int r, int x, int v) {
if (! k) k = ++ tot;
if (l == r) return sum[k] += v, void();
x <= mid ? ins(ls[k], l, mid, x, v) : ins(rs[k], mid + 1, r, x, v);
sum[k] = sum[ls[k]] + sum[rs[k]];
}
int ask( int k, int l, int r, int x, int y) {
if (! k) return 0;
if (x <= l && r <= y) return sum[k];
int res = 0;
if (x <= mid) res += ask(ls[k], l, mid, x, y);
if (y > mid) res += ask(rs[k], mid + 1, r, x, y);
return res;
}
int rt1[N], rt2[N], f[N];
signed main() {
ios :: sync_with_stdio(false);
n = read(), Q = read(), A = read();
for ( int i = 1; i <= n; i ++) a[i] = read();
for ( int i = 1; i < n; i ++) {
int u = read(), v = read(), w = read();
G[u].push_back({v, w}), G[v].push_back({u, w});
}
dfs1(1, 0), dfs2(1, 1);
S.init(), S.root = S.build(1);
for ( int u = 1; u <= n; u ++) {
for ( int x = u; x; x = S.fa[x]) {
int d = Dis(u, x);
ins(rt1[x], 0, A, a[u], d);
f[x] += 1;
if (S.fa[x]) {
d = Dis(u, S.fa[x]);
ins(rt2[x], 0, A, a[u], d);
}
}
}
int lst = 0;
while (Q --) {
int u = read(), a = read(), b = read();
int L = min((a + lst) % A, (b + lst) % A), R = min((a + lst) % A, (b + lst) % A);
int ans = ask(rt1[u], 0, A, L, R);
for ( int x = u; S.fa[x]; x = S.fa[x]) {
ans += ask(rt1[S.fa[x]], 0, A, L, R);
ans -= ask(rt2[x], 0, A, L, R);
ans += (f[S.fa[x]] - f[x]) * Dis(S.fa[x], u);
}
cout << (lst = ans) << endl;
}
}