Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30735 liuyile 【S】T2 C++ 通过 100 503 MS 53812 KB 4083 2024-07-30 13:00:29

Tests(18/18):


#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 int n,dep[200300],siz[200300],dfn[200300],fa[200300],q; vector<int>g[200300]; int tk; inline void dfs(int u){ dfn[u]=++tk,siz[u]=1,dep[u]=dep[fa[u]]+1; for(int v:g[u])dfs(v),siz[u]+=siz[v]; } const int M=1e9+7; struct node{ int a,b; node(){a=0,b=0;} node(int A,int B){a=A,b=B;} inline int f(int x){return (a+b*x%M+2*M)%M;} friend node operator +(const node A,const node B){ return {(A.a+B.a)%M,(A.b+B.b)%M}; } }; int x[200300],a[200300],b[200300]; vector<int>rem[200300]; set<int>S; node A[200300<<2],B[200300<<2]; #define lc(x) (x<<1) #define rc(x) (x<<1|1) inline void modA(int x,int l,int r,int L,int R,node k){ // cerr<<l<<" "<<r<<" "<<L<<" "<<R<<" "<<k.a<<" "<<k.b<<endl; // cerr.flush(); if(L<=l&&r<=R){ A[x]=A[x]+k; return ; } int mid=l+r>>1; if(L<=mid)modA(lc(x),l,mid,L,R,k); if(R>mid)modA(rc(x),mid+1,r,L,R,k); } inline void modB(int x,int l,int r,int L,int R,node k){ if(L<=l&&r<=R){ B[x]=B[x]+k; return ; } int mid=l+r>>1; if(L<=mid)modB(lc(x),l,mid,L,R,k); if(R>mid)modB(rc(x),mid+1,r,L,R,k); } inline node gA(int x,int l,int r,int c){ if(l==r)return A[x]; int mid=l+r>>1; node res=A[x]; if(c<=mid)res=res+gA(lc(x),l,mid,c); else res=res+gA(rc(x),mid+1,r,c); return res; } inline node gB(int x,int l,int r,int c){ if(l==r)return B[x]; int mid=l+r>>1; node res=B[x]; if(c<=mid)res=res+gB(lc(x),l,mid,c); else res=res+gB(rc(x),mid+1,r,c); return res; } inline void dop(int id){ int u=x[id]; if(dep[u]&1){ modA(1,1,n,dfn[u],dfn[u]+siz[u]-1,node(a[id],b[id])); modB(1,1,n,dfn[u],dfn[u]+siz[u]-1,node(-a[id],-b[id])); } else{ // cerr<<dfn[u]<<" "<<dfn[u]+siz[u]-1<<" "<<n<<"?"<<endl; // cerr.flush(); modA(1,1,n,dfn[u],dfn[u]+siz[u]-1,node(-a[id],-b[id])); modB(1,1,n,dfn[u],dfn[u]+siz[u]-1,node(a[id],b[id])); } } inline void rvk(int id){ a[id]=-a[id]; b[id]=-b[id]; dop(id); } signed main(){ ios::sync_with_stdio(0); // freopen("tre.in","r",stdin); // freopen("tre.out","w",stdout); cin>>n>>q; for(int i=2;i<=n;i++) cin>>fa[i],g[fa[i]].push_back(i); dfs(1); // for(int i=1;i<=n;i++)assert(dfn[i]); // for(int i=1;i<=n;i++) // cout<<siz[i]<<" "<<dfn[i]<<endl; int ct=0; // cerr<<q<<" "; int ws=0; while(q--){ int op,w; cin>>op>>w; // assert(w<=n); // assert(w>=1); if(op==1){ // ws++; // cerr<<"!"; ++ct; x[ct]=w; cin>>a[ct]>>b[ct]; S.insert(dfn[x[ct]]); // cout<<"SLLL"<<dfn[x[ct]]<<endl; rem[dfn[x[ct]]].push_back(ct); a[ct]-=dep[x[ct]]*b[ct]%M; dop(ct); } else if(op==2){ ws++; int x=w; node P; if(dep[x]&1)P=gA(1,1,n,dfn[x]); else P=gB(1,1,n,dfn[x]); cout<<P.f(dep[x])<<endl; } else if(op==3){ int x=w,s,t; // cin>>s>>t; // ws++; // cout<<"!"<<endl; int l=dfn[x],r=dfn[x]+siz[x]-1; auto it=S.lower_bound(l); if(it!=S.end()) // cout<<l<<" "<<r<<" "<<(*it)<<endl; while(it!=S.end()&&(*it)<=r){ int s=*it; // cout<<s<<"!"<<endl; // cout.flush(); for(int x:rem[s]) rvk(x); rem[s].clear(); S.erase(it); it=S.lower_bound(l); } } } // cerr<<ct<<endl; // cerr<<ws<<endl; fflush(stdout); cout.flush(); return 0; }


测评信息: