提交时间:2024-09-22 13:17:56

运行 ID: 32667

#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 p_b push_back #define m_p make_pair #define pi pair<int,int> #define p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=1e6+10,base=59,mod=998244353; const int LIM=60; const ll inf=1e18; 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; } struct SegTree { struct node { ll mx; }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define mx(p) d[p].mx void pu(int p){mx(p)=max(mx(ls(p)),mx(rs(p)));} void modify(int l,int s,int t,int p,ll v){ if(s==t){ mx(p)=v;return; }int mid=s+t>>1; if(l<=mid)modify(l,s,mid,ls(p),v);else modify(l,mid+1,t,rs(p),v);pu(p); }ll qry(int l,int r,int s,int t,int p){ if(l<=s&&t<=r)return mx(p); int mid=s+t>>1;ll res=0; if(l<=mid)res=max(res,qry(l,r,s,mid,ls(p)));if(r>=mid+1)res=max(res,qry(l,r,mid+1,t,rs(p))); return res; } #undef ls #undef rs #undef mx }T; int rt[maxn]; struct Treap { struct node { int ls,rs,rnd,siz; ll mx,val; }d[maxn*2]; int ct; #define ls(p) d[p].ls #define rs(p) d[p].rs #define rnd(p) d[p].rnd #define val(p) d[p].val #define mx(p) d[p].mx #define siz(p) d[p].siz int nnd(ll x){ int p=++ct; ls(p)=rs(p)=0,rnd(p)=rand(),siz(p)=1,mx(p)=val(p)=x; return p; } void pu(int p){ mx(p)=max(max(mx(ls(p)),mx(rs(p))),val(p)); siz(p)=siz(ls(p))+siz(rs(p))+1; }void spl(int p,int k,int &x,int &y){ if(!p){x=y=0;return;} if(siz(ls(p))>=k){ y=p;spl(ls(p),k,x,ls(y));pu(y); }else { x=p;spl(rs(p),k-siz(ls(p))-1,rs(x),y);pu(x); } }int mg(int p,int q){ if((!p)||(!q))return p|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; } }ll gmx(int u,int l){ int p=0,q=0; spl(rt[u],l-1,p,q); ll res=mx(q);rt[u]=mg(p,q); return res; } }Treap; int n,q,fa[maxn],dfn[maxn],rnk[maxn],top[maxn],dep[maxn],siz[maxn],son[maxn],ct; ll a[maxn]; vector<int>v[maxn]; void dfs(int u){ siz[u]=1; for(int x:v[u]){ dep[x]=dep[u]+1;dfs(x),siz[u]+=siz[x]; if(siz[x]>siz[son[u]])son[u]=x; } }void dfs2(int u,int tp){ dfn[u]=++ct,rnk[ct]=u,top[u]=tp; if(!son[u]){ up(i,dfn[tp],dfn[u])rt[tp]=Treap.mg(rt[tp],Treap.nnd(a[rnk[i]])); T.modify(dfn[tp],1,n,1,Treap.mx(rt[tp])); }else { dfs2(son[u],tp); for(int x:v[u])if(x!=son[u])dfs2(x,x); } } vector<pair<int,ll> >add; set<int>upd; set<int>s; int deg[maxn]; void modify(int u,int lim){ int tp=top[u]; if(dep[tp]>=dep[lim]){ int w=0; Treap.spl(rt[tp],1,w,rt[tp]);upd.insert(tp); if(dep[tp]>dep[lim])upd.insert(top[fa[tp]]),add.p_b(m_p(fa[tp],Treap.mx(w))); rt[tp]=Treap.mg(rt[tp],Treap.nnd(0)); }else { int p=0,q=0,r=0;upd.insert(tp); Treap.spl(rt[tp],dep[lim]-dep[tp],p,q); Treap.spl(q,1,q,r); rt[tp]=Treap.mg(Treap.mg(p,r),Treap.nnd(0)); } } void modify(int u){ add.clear(),upd.clear(); auto it=s.lower_bound(dfn[u]); vector<int>S; while(it!=s.end()&&(*it)<=dfn[u]+siz[u]-1){ int w=(*it);S.p_b(rnk[w]);it++; }for(int x:S)modify(x,u); for(int x:S){ //cout<<"test "<<x<<"\n"; s.erase(dfn[x]),--deg[fa[x]]; if(top[x]==top[fa[x]])s.insert(dfn[fa[x]]); } for(auto it:add){ int x=it.p1;ll y=it.p2; if(!x)continue; //cout<<"add "<<x<<" "<<y<<"\n"; int u=top[x]; int p=0,q=0,r=0; Treap.spl(rt[u],dep[x]-dep[u],p,q); Treap.spl(q,1,q,r); //cout<<"? "<<Treap.val(q)<<"\n"; Treap.val(q)+=y,Treap.mx(q)+=y; rt[u]=Treap.mg(Treap.mg(p,q),r); }for(int x:upd)if(x)T.modify(dfn[x],1,n,1,Treap.mx(rt[x])); } ll qry(int u){ ll res=T.qry(dfn[u],dfn[u]+siz[u]-1,1,n,1); res=max(res,Treap.gmx(top[u],dep[u]-dep[top[u]]+1)); return res; } void slv(){ n=read(),q=read(); up(i,1,n)a[i]=read();up(i,2,n)fa[i]=read(),v[fa[i]].p_b(i),++deg[fa[i]]; dfs(1),dfs2(1,1); up(i,1,n)if(!son[i])s.insert(dfn[i]); while(q--){ int op=read(),u=read(); if(op==1)printf("%lld\n",qry(u)); else modify(u); } } int main(){ //freopen("1.in","r",stdin),freopen("1.out","w",stdout); //int t=read();while(t--)slv(); slv(); return 0; }