rt,卡不动了,求大佬帮卡
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 5, mod = 201314;
int n, m;
struct qry {
int id, x, val;
};
vector<qry> v[maxn];
vector<int> e[maxn];
int dep[maxn], f[maxn], top[maxn], dfn[maxn], rev[maxn], val[maxn], tot, sz[maxn], son[maxn];
long long ans[maxn];
void dfs1(int u) {
dep[u] = dep[f[u]] + 1;
sz[u] = 1;
for (int i = 0; i < e[u].size(); i++) {
int v = e[u][i];
dfs1(v);
sz[u] += sz[v];
if(sz[son[u]] < sz[v])
son[u] = v;
}
}
void dfs2(int u, int t) {
top[u] = t;
dfn[u] = ++tot;
rev[tot] = u;
if(!son[u])
return ;
dfs2(son[u], son[u]);
for (int i = 0; i < e[u].size(); i++) {
int v = e[u][i];
if(v == son[u])
continue;
dfs2(v, v);
}
}
struct Segtree {
long long tr[maxn << 2];
int laz[maxn << 2];
void pushup(int t) {
tr[t] = tr[t << 1] + tr[t << 1 | 1];
}
void addtag(int l, int r, int t, int val) {
tr[t] += 1ll * val * (r - l + 1), laz[t] += val;
}
void pushdown(int l, int r, int t) {
int mid = l + r >> 1;
addtag(l, mid, t << 1, laz[t]);
addtag(mid + 1, r, t << 1 | 1, laz[t]);
laz[t] = 0;
}
void update(int l, int r, int x, int y, int t, int val) {
if(x <= l && r <= y) {
addtag(l, r, t, val);
return ;
}
int mid = l + r >> 1;
pushdown(l, r, t);
if(x <= mid)
update(l, mid, x, y, t << 1, val);
if(mid < y)
update(mid + 1, r, x, y, t << 1 | 1, val);
pushup(t);
}
int query(int l, int r, int x, int y, int t) {
if(x <= l && r <= y)
return tr[t];
int mid = l + r >> 1;
long long ans = 0;
if(x <= mid)
ans += query(l, mid, x, y, t << 1);
if(mid < y)
ans += query(mid + 1, r, x, y, t << 1 | 1);
return ans;
}
} tree;
void add(int x, int y) {
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]])
swap(x, y);
tree.update(1, n, dfn[top[x]], dfn[x], 1, 1);
x = f[top[x]];
}
if(dep[x] > dep[y])
swap(x, y);
tree.update(1, n, dfn[x], dfn[y], 1, 1);
}
long long query(int x, int y) {
long long ans = 0;
while(top[x] != top[y]) {
if(dep[top[x]] < dep[top[y]])
swap(x, y);
ans += tree.query(1, n, dfn[top[x]], dfn[x], 1);
x = f[top[x]];
}
if(dep[x] > dep[y])
swap(x, y);
ans += tree.query(1, n, dfn[x], dfn[y], 1);
return ans;
}
int read() {
int sum = 0;
char c = getchar();
while(!isdigit(c))
c = getchar();
while(isdigit(c))
sum = sum * 10 + c - '0', c = getchar();
return sum;
}
signed main() {
// freopen("test.in", "r", stdin);
// freopen("test.out", "w", stdout);
n = read(), m = read();
for (int i = 2; i <= n; i++)
f[i] = read(), f[i]++, e[f[i]].push_back(i);
dfs1(1);
dfs2(1, 1);
for (int i = 1; i <= m; i++) {
int l = read() + 1, r = read() + 1, x = read() + 1;
v[r].push_back(qry{i, x, 1});
v[l - 1].push_back(qry{i, x, -1});
}
for (int i = 1; i <= n; i++) {
add(1, i);
for (int j = 0; j < v[i].size(); j++)
ans[v[i][j].id] += v[i][j].val * query(1, v[i][j].x);
}
for (int i = 1; i <= m; i++)
printf("%lld\n", (ans[i]) % mod);
return 0;
}