rt.下载数据后发现我输出一半对一半错,UB 也查完了,还是找不到问题 球球大佬们帮忙看看吧
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 5e4 + 10;
const int mod = 201314;
struct edge {
int v, nxt;
} e[MAXN];
int tot, head[MAXN];
inline
void add(int u, int v) {
e[++tot] = { v, head[u] }, head[u] = tot;
}
int dep[MAXN], fa[MAXN], size[MAXN], son[MAXN];
int top[MAXN], id[MAXN], rev[MAXN], cnt;
void dfs1(int u, int f) {
size[u] = 1, fa[u] = f, dep[u] = dep[f] + 1;
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].v;
if (v == f) continue;
dfs1(v, u);
size[u] += size[v];
if (size[v] > size[son[u]]) son[u] = v;
}
}
void dfs2(int u, int t) {
top[u] = t, id[u] = ++cnt, rev[cnt] = u;
if (!son[u]) return ;
dfs2(son[u], t);
for (int i = head[u], v; i; i = e[i].nxt) {
v = e[i].v;
if (v != fa[u] && v != son[u]) dfs2(v, v);
}
}
struct node {
int l, r;
int add, sum;
} t[MAXN << 2];
inline
int calc(int p) {
return t[p].r - t[p].l + 1;
}
inline
void pushup(int p) {
t[p].sum = (t[p << 1].sum + t[p << 1 | 1].sum) % mod;
}
inline
void pushdown(int p) {
if (!t[p].add) return ;
t[p << 1].add = (t[p << 1].add + t[p].add) % mod;
t[p << 1 | 1].add = (t[p << 1 | 1].add + t[p].add) % mod;
t[p << 1].sum = (t[p << 1].sum + t[p].add * calc(p << 1) % mod) % mod;
t[p << 1 | 1].sum = (t[p << 1 | 1].sum + t[p].add * calc(p << 1 | 1) % mod) % mod;
t[p].add = 0;
}
void build(int l, int r, int p) {
t[p].l = l, t[p].r = r;
if (l == r) return t[p].sum = 0, void();
int mid = l + r >> 1;
build(l, mid, p << 1), build(mid + 1, r, p << 1 | 1);
pushup(p);
}
int query(int l, int r, int p) {
if (l <= t[p].l && t[p].r <= r) return t[p].sum;
pushdown(p);
int mid = t[p].l + t[p].r >> 1, ans = 0;
if (l <= mid) ans = (ans + query(l, r, p << 1)) % mod;
if (r > mid) ans = (ans + query(l, r, p << 1 | 1)) % mod;
return ans;
}
void update(int l, int r, int p, int k) {
if (l <= t[p].l && t[p].r <= r) {
t[p].add = (t[p].add + k) % mod;
t[p].sum = (t[p].sum + k * calc(p) % mod) % mod;
return ;
}
pushdown(p);
int mid = t[p].l + t[p].r >> 1;
if (l <= mid) update(l, r, p << 1, k);
if (r > mid) update(l, r, p << 1 | 1, k);
pushup(p);
}
inline
int qrange(int x, int y) {
int ans = 0;
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap(x, y);
ans = (ans + query(id[top[x]], id[x], 1)) % mod;
x = fa[top[x]];
}
if (dep[x] > dep[y]) swap(x, y);
return (ans + query(id[x], id[y], 1)) % mod;
}
inline
void urange(int x, int y, int k) {
while (top[x] != top[y]) {
if (dep[top[x]] < dep[top[y]]) swap(x, y);
update(id[top[x]], id[x], 1, k);
x = fa[top[x]];
}
if (dep[x] > dep[y]) swap(x, y);
update(id[x], id[y], 1, k);
}
vector<int> v1[MAXN], v2[MAXN];
int res1[MAXN], res2[MAXN], z[MAXN];
int n, m;
int main() {
scanf("%d%d", &n, &m);
for (int i = 2, x; i <= n; i++) scanf("%d", &x), add(x + 1, i);
dfs1(1, 0), dfs2(1, 1), build(1, n, 1);
for (int i = 1, l, r; i <= m; i++) {
scanf("%d%d%d", &l, &r, &z[i]);
l++, r++, z[i]++;
v1[l - 1].push_back(z[i]), v2[r].push_back(z[i]);
}
for (int i = 1; i <= n; i++) {
urange(1, i, 1);
for (auto x : v1[i]) res1[x] = qrange(1, x);
for (auto x : v2[i]) res2[x] = qrange(1, x);
}
for (int i = 1; i <= m; i++) printf("%d\n", (res2[z[i]] - res1[z[i]] + mod) % mod);
}