比赛 |
2025.9.6 |
评测结果 |
AAAAAAAAAAAAAAAAA |
题目名称 |
Ski Slope |
最终得分 |
100 |
用户昵称 |
wdsjl |
运行时间 |
5.215 s |
代码语言 |
C++ |
内存使用 |
31.64 MiB |
提交时间 |
2025-09-06 10:48:16 |
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 2e5 + 5;
ll n, m, p[N], e[N], d[N], mxn[13][N], k;
struct node {
ll mx[13];
ll sum;
} a[N];
ll ans[13][N], maxn[13][N];
bool cmp2(node u, node v) {
return u.mx[k] < v.mx[k];
}
int main() {freopen("Ski.in","r",stdin);freopen("Ski.out","w",stdout);
scanf("%lld",&n);
for (ll i = 2; i <= n; ++i) {
scanf("%lld%lld%lld",&p[i],&d[i],&e[i]);
e[i] += e[p[i]];
a[i].sum = e[i];
for (ll j = 1; j <= 11; ++j) {
mxn[j][i] = mxn[j][p[i]];
}
for (ll j = 1; j <= 11; ++j) {
if (d[i] > mxn[j][i]) {
swap(d[i], mxn[j][i]);
}
a[i].mx[j] = mxn[j][i];
}
}
for (k = 1; k <= 11; ++k) {
sort(a + 1, a + 1 + n, cmp2);
for (ll i = 2; i <= n; ++i) {
ans[k][i] = max(ans[k][i-1], a[i].sum);
maxn[k][i] = a[i].mx[k];
}
}
scanf("%lld",&m);
while (m--) {
ll x,y;
scanf("%lld%lld",&x,&y);
ll cur = upper_bound(maxn[y+1] + 1, maxn[y+1] + n + 1, x) - maxn[y+1] - 1;
cout << ans[y+1][cur] << '\n';
}
return 0;
}