拍不出来一点。
#include<bits/stdc++.h>
using namespace std;
#define QwQ330AwA return 0
#define ll long long
const int N = 5e5 + 5;
vector <int> e[N];
vector <int> L[N], R[N];
int dfn[N], tim;
int id[N];
int n, m;
struct Node {
ll x, c;
} w[N];
namespace Seg {
#define ls (p << 1)
#define rs ((p << 1) | 1)
vector <int> t[N << 2];
int now[N << 2];
const ll inf = 1e18;
double slope(int i, int j) {
return (double)((double)w[i].x * w[i].x + w[i].c - (double)w[j].x * w[j].x - w[j].c) / (w[i].x - w[j].x);
}
void upd(int p, int l, int r, int L, int R, int x) {
if (L <= l && r <= R) {
if (t[p].size() && w[t[p].back()].x == w[x].x) {
if (w[t[p].back()].c >= w[x].c) t[p].pop_back();
else return ;
}
while (t[p].size() >= 2 && slope(t[p][t[p].size() - 2], t[p].back()) > slope(t[p].back(), x)) t[p].pop_back();
t[p].push_back(x);
return ;
}
int mid = (l + r) / 2;
if (L <= mid) upd(ls, l, mid, L, R, x);
if (mid < R) upd(rs, mid + 1, r, L, R, x);
}
ll query(int p, int l, int r, int x, ll y) {
ll qwq = inf;
while (now[p] + 1 < (int)t[p].size() && slope(t[p][now[p]], t[p][now[p] + 1]) <= 2 * y) now[p]++;
if (now[p] < (int)t[p].size()) qwq = (y - w[t[p][now[p]]].x) * (y - w[t[p][now[p]]].x) + w[t[p][now[p]]].c;
if (l == r) return qwq;
int mid = (l + r) / 2;
if (x <= mid) return min(qwq, query(ls, l, mid, x, y));
else return min(qwq, query(rs, mid + 1, r, x, y));
}
}
void dfs(int u) {
dfn[u] = ++tim;
if (id[u] > 0) L[id[u]].push_back(tim);
if (id[u] < 0) R[-id[u]].push_back(tim - 1);
for (auto v : e[u]) dfs(v);
if (id[u] < 0) L[-id[u]].push_back(tim + 1);
if (id[u] > 0) R[id[u]].push_back(tim);
}
int pos[N];
struct Ask {
ll x, t;
int id;
} q[N];
ll ans[N];
signed main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> w[0].c;
w[0].x = 0;
for (int i = 1; i < n; i++) {
int op;
cin >> op;
if (op == 0) {
int fa, id;
cin >> fa >> id;
assert(id < n);
int y, z;
cin >> w[id].x >> y >> z >> w[id].c;
::id[i] = id;
e[fa].push_back(i);
} else {
int fa, id;
cin >> fa >> id;
assert(id < n);
::id[i] = -id;
e[fa].push_back(i);
}
}
dfs(0);
for (int i = 0; i < n; i++) pos[i] = i;
sort(pos, pos + n, [&](int u, int v) {
return w[u].x < w[v].x;
});
//Seg::upd(1, 1, n, 1, n, 0);
for (int i = 0; i < n; i++) {
int x = pos[i];
if (x == 0) Seg::upd(1, 1, n, 1, n, 0);
for (int j = 0; j < (int)L[x].size(); j++) {
int l = L[x][j], r = R[x][j];
if (l <= r) Seg::upd(1, 1, n, l, r, x);
}
}
for (int i = 1; i <= m; i++) cin >> q[i].x >> q[i].t, q[i].id = i;
sort(q + 1, q + m + 1, [&](Ask u, Ask v) {
return u.x < v.x;
});
for (int i = 1; i <= m; i++) ans[q[i].id] = Seg::query(1, 1, n, dfn[q[i].x], q[i].t);
for (int i = 1; i <= m; i++) cout << ans[i] << '\n';
QwQ330AwA;
}