cf685B水题

#include
#include
using namespace std;
inline void read(int &a){
    char c=getchar();int f=1;a=0;
    while(c>'9'||c<'0'){if(c=='-') f=-1;c=getchar();}
    while(c<='9'&&c>='0') a=(a<<1)+(a<<3)+c-48,c=getchar();
    a*=f;
}
inline int max(int a,int b){return a>b?a:b;}
const int MAXN=300010;
struct edge{int u,v,pre;}e[MAXN];
int n,q,head[MAXN],fa[MAXN],cnt,s[MAXN],P,ans[MAXN],m[MAXN],t[MAXN],B[MAXN];
inline void addedge(int U,int V){
    e[++cnt].u=U;e[cnt].v=V;e[cnt].pre=head[U];head[U]=cnt;
}
inline void getsum(int now){
    for(int i=head[now];i;i=e[i].pre)
        getsum(e[i].v),s[now]+=s[e[i].v],m[now]=max(m[now],s[e[i].v]);
    ++s[now];
}
inline void getans(int now){
    ans[now]=now;
    for(int i=head[now];i;i=e[i].pre){
        getans(e[i].v);t[now]=ans[e[i].v];
        B[e[i].v]=t[now];t[now]=fa[t[now]];
        while(t[now]!=now&&max(s[now]-s[B[e[i].v]],m[B[e[i].v]])>max(s[now]-s[t[now]],m[t[now]]))
            B[e[i].v]=t[now],t[now]=fa[t[now]];
        if(max(s[now]-s[B[e[i].v]],m[B[e[i].v]])             ans[now]=B[e[i].v]; 
    }
}
int main(){
    read(n);read(q);
    for(int i=2;i<=n;++i) read(fa[i]),addedge(fa[i],i);
    getsum(1);getans(1);
    while(q--) read(P),printf("%d\n",ans[P]);
    return 0;
}

 

 

太简单了不说思路

你可能感兴趣的:(cf685B水题)