提交时间:2025-01-08 19:04:00

运行 ID: 35921

#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair<int,int> #define p1 first #define p2 second #define p_b push_back #define m_p make_pair using namespace std; typedef long long ll; const int maxn=3e5+10,mod=998244353; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,rt,fa[maxn];ll tim[maxn],a[maxn]; vector<int>E[maxn]; int top[maxn],siz[maxn],son[maxn]; mt19937 rng(0); struct treap { struct nd { int ls,rs,rnd; int lz,loc;ll mx,v; }d[maxn]; #define ls(p) d[p].ls #define rs(p) d[p].rs #define rnd(p) d[p].rnd #define loc(p) d[p].loc #define lz(p) d[p].lz #define v(p) d[p].v #define mx(p) d[p].mx int ct; int nnd(int x,ll y){ int p=++ct; ls(p)=rs(p)=0,rnd(p)=rng(),loc(p)=x,lz(p)=0,v(p)=mx(p)=y; return p; } void pu(int p){mx(p)=max(max(mx(ls(p)),mx(rs(p))),v(p));} void cl(int p,int x){if(!p)return;loc(p)+=x,lz(p)+=x,mx(p)-=x,v(p)-=x;} void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=0;} void spl(int u,int k,int &p,int &q){ if(!u){p=q=0;return;}pd(u); if(loc(u)>k){ q=u;spl(ls(u),k,p,ls(q));pu(q); }else { p=u;spl(rs(u),k,rs(p),q);pu(p); } }int mg(int p,int q){ if((!p)||(!q))return p|q;pd(p),pd(q); if(rnd(p)<rnd(q)){ rs(p)=mg(rs(p),q);pu(p);return p; }else { ls(q)=mg(p,ls(q));pu(q);return q; } }void ins(int &u,int x,ll y){ int p=0,q=0; spl(u,x,p,q);u=mg(mg(p,nnd(x,y)),q); } ll qry(int &u,int l,int r){ int p=0,q=0,rr=0; spl(u,l-1,p,q),spl(q,r,q,rr); ll res=mx(q);u=mg(p,mg(q,rr)); return res; } void SPL(int &u,int &q,int lim){ spl(u,lim,q,u); if(!q){q=-1;return;} ls(q)=rs(q)=0,lz(q)=0,v(q)=mx(q); } }T; int root[maxn],dep[maxn]; void dfs(int u){ siz[u]=1,dep[u]=dep[fa[u]]+1; for(int x:E[u])if(x!=fa[u]){ fa[x]=u,dfs(x),siz[u]+=siz[x];if(siz[x]>siz[son[u]])son[u]=x; } } void dfs2(int u,int tp){ top[u]=tp; if(!son[u])return; dfs2(son[u],tp); for(int x:E[u])if(x!=fa[u]&&x!=son[u])dfs2(x,x); } ll qry(int u){ ll res=0; while(u){ int x=top[u];res=max(res,T.qry(root[x],dep[x],dep[u])); u=fa[x]; }return res; }void modify(int u){ int q=-1; while(u){ int x=top[u]; int tq=-1; if(q!=-1){ //cout<<"ins "<<T.d[q].loc<<" "<<T.d[q].v<<endl; T.d[q].loc--,T.d[q].v++;tq=q; q=-1; }T.SPL(root[x],q,dep[x]); int lim=dep[u],qwe=0; T.spl(root[x],lim,root[x],qwe); T.cl(root[x],-1); root[x]=T.mg(root[x],qwe); if(tq!=-1){ swap(q,tq); T.ins(root[x],T.d[q].loc,T.d[q].v); swap(q,tq); } if(x==rt&&q!=-1){ //cout<<"loc="<<T.d[q].loc<<" "<<T.d[q].v<<endl; T.d[q].mx=++T.d[q].v; root[x]=T.mg(q,root[x]); } u=fa[x]; } } ll ans[maxn]; void slv(){ n=read(),rt=read();up(i,1,n)a[i]=read(); up(i,1,n-1){ int x=read(),y=read(); E[x].p_b(y),E[y].p_b(x); } dep[0]=-1;dfs(rt);dfs2(rt,rt); root[rt]=T.nnd(0,1); ll res=0; up(i,1,n){ //cout<<"qry "<<qry(i)<<endl; ans[i]=qry(i)+dep[i]+a[i];res=max(res,ans[i]); //cout<<"mx="<<T.qry(root[4],0,0)<<endl; modify(i); //cout<<"mx="<<T.qry(root[4],0,0)<<endl; T.ins(root[top[i]],dep[i],ans[i]-dep[i]+1); //cout<<"mx="<<T.d[root[4]].mx<<endl; //cout<<"mx="<<T.qry(root[3],0,0)<<" "<<T.d[root[3]].mx<<endl; //cout<<"test "<<T.d[root[3]].mx<<endl; //cout<<ans[i]<<endl; }cout<<res; } int main(){ //freopen("garbage.in","r",stdin); //freopen("garbage.out","w",stdout); slv(); fclose(stdin); fclose(stdout); return 0; }