比赛 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;
}