Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
32655 liuyile 【S】T3 C++ 运行出错 0 493 MS 133892 KB 4494 2024-09-18 18:32:00

Tests(0/6):


#include <bits/stdc++.h> using namespace std; #define int long long #define endl "\n" #define pii pair<int,int> #define p1(x) x.first #define p2(x) x.second #define lc(x) (x<<1) #define rc(x) (x<<1|1) int w[1000300<<2]; struct node{ int c[2],siz,rd,w,mx; }T[1000300]; mt19937 RD(99833); int fa[1000030],dep[1000300],dfn[1000300],loc[1000300],tk,fd[1000030]; int rt[1000030]; set<int>S; vector<int>NW; int n,q; vector<int>son[1000300]; int SIZ[100300]; inline void updd(int x){w[x]=max(w[lc(x)],w[rc(x)]);} inline void mod(int x,int l,int r,int c,int p){ if(l==r){w[x]=p;return ;} int mid=l+r>>1; if(c<=mid)mod(lc(x),l,mid,c,p); else mod(rc(x),mid+1,r,c,p); } inline int g(int x,int l,int r,int L,int R){ if(L<=l&&r<=R)return w[x]; int mid=l+r>>1; int rs=0; if(L<=mid)rs=max(rs,g(lc(x),l,mid,L,R)); if(R>mid)rs=max(rs,g(rc(x),mid+1,r,L,R)); return rs; } inline void upd(int x){ T[x].mx=max({T[x].w,T[T[x].c[0]].mx,T[T[x].c[1]].mx}); T[x].siz=T[T[x].c[0]].siz+T[T[x].c[1]].siz+1; } inline int merge(int x,int y){ if(!x||!y)return x|y; if(T[x].rd<T[y].rd){ T[x].c[1]=merge(T[x].c[1],y); upd(x); return x; } else{ T[y].c[0]=merge(x,T[y].c[0]); upd(y); return y; } } inline void sp_s(int &x,int &y,int now,int k){ if(!now){x=y=0;return ;} if(T[T[now].c[0]].siz+1<=k){ x=now; sp_s(T[x].c[1],y,T[now].c[1],k-T[T[now].c[0]].siz+1); } else{ y=now; sp_s(x,T[y].c[0],T[now].c[0],k); } upd(now); } inline int del(int &x,int k){ int a,b,c; sp_s(a,b,x,k-1); sp_s(b,c,b,1); x=merge(a,c); return T[b].w; } inline int gsuf(int &x,int k){ int a,b; sp_s(x,a,b,k-1); int r=T[b].mx; x=merge(a,b); return r; } inline int ff(int x){return fd[x]==x?x:fd[x]=ff(fd[x]);} inline void merg(int x,int y){ fd[ff(x)]=ff(y); } inline void merfa(int x){ if(!fa[x])return ; int p=ff(fa[x]); rt[p]=merge(rt[p],rt[x]); merg(x,fa[x]); } inline bool chk(int x){ int p=ff(x); return dep[x]-dep[p]+1<=T[rt[p]].siz; } inline void chkson(int x){ if(!chk(son[x].back())) while(!son[x].empty()){ int p=son[x].back(); if(chk(p)){ merfa(p); break; } son[x].pop_back(); } if(son[x].empty()) NW.push_back(x); } inline void fls(){ for(int x:NW) S.insert(dfn[x]); NW.clear(); } inline void add(int x,int k){ int p=ff(x); int s=dep[x]-dep[p]+1; int a,b,c; sp_s(rt[p],a,b,s-1); sp_s(b,b,c,1); if(b) T[b].mx=(T[b].w+=k); rt[p]=merge(a,merge(b,c)); } inline void mod(int x){ vector<int>UPD; int l=dfn[x],r=dfn[x]+SIZ[x]-1; int p=ff(x); del(rt[p],dep[x]-dep[p]+1); UPD.push_back(p); if(fa[x])chkson(fa[x]); vector<pii>E; while(1){ auto it=S.lower_bound(l); if(it==S.end()||*it>r)break; int y=*it; S.erase(it); int q=ff(y); if(q!=p) E.push_back({fa[q],del(rt[q],1)}),UPD.push_back(q); chkson(fa[q]); } for(pii e:E) add(p1(e),p2(e)); for(int x:UPD) mod(1,1,n,dfn[x],T[rt[ff(x)]].mx); fls(); } inline int calc(int x){ int p=ff(x); int A=g(1,1,n,dfn[x],dfn[x]+SIZ[x]-1); return max(A,gsuf(rt[ff(x)],dep[x]-dep[p]+1)); } inline void dfs(int u){ loc[dfn[u]=++tk]=u; for(int v:son[u]) dfs(v); } signed main(){ ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("genshin.in","r",stdin); // freopen("genshin.out","w",stdout); cin>>n>>q; for(int i=1;i<=n;i++) T[i].rd=RD(),rt[i]=i,cin>>T[i].w,T[i].mx=T[i].w,fd[i]=i; for(int i=2;i<=n;i++){ cin>>fa[i]; dep[i]=dep[fa[i]]+1; son[fa[i]].push_back(i); } for(int i=n;i>=1;i--) SIZ[fa[i]]+=(SIZ[i]+=1); SIZ[0]=0; for(int i=1;i<=n;i++) if(!son[i].empty()) merfa(son[i].back()); else S.insert(dfn[i]); for(int i=1;i<=n;i++) if(!fa[i]||son[fa[i]].back()!=i){ } while(q--){ int op,x; cin>>op>>x; if(op==1)cout<<calc(x)<<endl; else mod(x); // if(q==5)break; } cout.flush(); return 0; }


测评信息: