牛客周赛88 G

#include<bits/stdc++.h>
using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int,int>;
using db = double;
const int N=2e5+10;
#define int long long
int a[N],f[N],w[N];
int n,q;
int pre[N];
int L[N],R[N];
map<int,int >mp;
int pre_mx[N],suf_mx[N];
vector<int> leaf(1,0);
vector<int> adj[N];
void add(int x,int y){
    w[y]=max(w[y],a[y]+w[x]);
    if(f[y]==0) return;
    add(y,f[y]);
}
void del(int x,int y){
    w[y]=a[y];
    for(auto v:adj[y]){
        if(v==x) continue;
        w[y]=max(w[y],w[v]+a[y]);
    }
    if(f[y]==0) return;
    del(x,f[y]);
}
void dfs(int u,int fa){
    w[u]=a[u];
    pre[u]=pre[fa]+a[u];
    L[u]=R[u]=u;
    if(adj[u].size()==0){
        mp[u]=leaf.size();
        leaf.push_back(u);
        return;
    }
    for(auto v:adj[u]){
        if(v==fa) continue;
        dfs(v,u);
        w[u]=max(w[u],w[v]+a[u]);
    }
    L[u]=L[adj[u][0]];
    R[u]=R[adj[u][adj[u].size()-1]];
}
signed main(){
    std::ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    cin>>n>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        w[i]=a[i];
    }
    for(int i=2;i<=n;i++){
        cin>>f[i];
        adj[f[i]].push_back(i);
    }
    dfs(1,0);
    for(int i=1;i<leaf.size();i++){
        pre_mx[i]=max(pre_mx[i-1],pre[leaf[i]]);
    }
    for(int i=leaf.size()-1;i>=1;i--){
        suf_mx[i]=max(suf_mx[i+1],pre[leaf[i]]);
    }
    while(q--){
        int x,y;
        cin>>x>>y;
        int l=mp[L[x]],r=mp[R[x]];
        int ans=max(pre_mx[l-1],suf_mx[r+1]);
        ans=max(ans,pre[f[x]]);
        ans=max(ans,pre[y]+w[x]);
        cout<<ans<<endl;
    }
    return 0;
}