rt,全 Wa。
初步估计是弱智错误。
#include <iostream>
#include <cstdio>
#include <vector>
#define mid ((l+r)>>1)
#define ls (p<<1)
#define rs (ls^1)
#define int long long
using namespace std;
const int N = 1e5 + 5, MOD = 201314;
int n, m, fa[N], top[N], sz[N], dfn[N], dfsid, hs[N], ans[N<<1], t[N<<2], tag[N<<2];
struct node{
int val, id;
};
vector <int> e[N];
vector <node> g[N];
int dfs1(int x)
{
dfn[x] = ++dfsid, sz[x] = 1ll, top[x] = x;
for(int i = 0ll;i < e[x].size();i++)
{
sz[x] += dfs1(e[x][i]);
if(sz[e[x][i]] > sz[hs[x]])
hs[x] = e[x][i];
}
return sz[x];
}
void dfs2(int x)
{
if(hs[x])
{
top[hs[x]] = top[x];
dfs2(hs[x]);
}
for(int i = 0ll;i < e[x].size();i++)
if(e[x][i] != hs[x])
dfs2(e[x][i]);
}
void push_down(int p, int l, int r)
{
if(tag[p] == 0ll) return ;
(t[ls] += tag[p] * (mid - l + 1ll) % MOD) %= MOD, (tag[ls] += tag[p]) %= MOD;
(t[rs] += tag[p] * (r - mid) % MOD) %= MOD, (tag[rs] += tag[p]) %= MOD;
tag[p] = 0ll;
}
void push_up(int p){t[p] = (t[ls] + t[rs]) % MOD;}
void update(int p, int l, int r, int ll, int rr, int val)
{
if(ll <= l && r <= rr)
{
(t[p] += val * (r - l + 1ll) % MOD) %= MOD, (tag[p] += val) %= MOD;
return ;
}
push_down(p, l, r);
if(ll <= mid) update(ls, l, mid, ll, rr, val);
if(rr > mid) update(rs, mid + 1ll, r, ll, rr, val);
push_up(p);
}
int query(int p, int l, int r, int ll, int rr)
{
if(ll <= l && r <= rr) return t[p];
push_down(p, l, r);
int res = 0ll;
if(ll <= mid) (res += query(ls, l, mid, ll, rr)) %= MOD;
if(rr > mid) (res += query(rs, mid + 1ll, r, ll, rr)) %= MOD;
return res;
}
void add(int x)
{
while(top[x] != 1ll)
{
update(1ll, 1ll, n, dfn[top[x]], dfn[x], 1ll);
x = fa[top[x]];
}
update(1ll, 1ll, n, dfn[top[x]], dfn[x], 1ll);
}
int solve(int x)
{
int res = 0ll;
while(top[x] != 1ll)
{
(res += query(1ll, 1ll, n, dfn[top[x]], dfn[x])) %= MOD;
x = fa[top[x]];
}
(res += query(1ll, 1ll, n, dfn[top[x]], dfn[x])) %= MOD;
return res;
}
signed main()
{
scanf("%lld %lld", &n, &m);
for(int i = 2ll;i <= n;i++)
{
scanf("%lld", &fa[i]);
e[++fa[i]].push_back(i);
}
dfs1(1ll);
dfs2(1ll);
for(int p = 1ll, l, r, z;p <= m;p++)
{
scanf("%lld %lld %lld", &l, &r, &z);
z++, r++;
g[l].push_back({z, ls});
g[r].push_back({z, rs});
}
for(int i = 1ll;i <= n;i++)
{
add(i);
for(int j = 0ll;j < g[i].size();j++)
ans[g[i][j].id] = solve(g[i][j].val);
}
for(int p = 1ll;p <= m;p++)
printf("%lld\n", (ans[rs] - ans[ls] + MOD) % MOD);
return 0;
}