Run ID 作者 问题 语言 测评结果 分数 时间 内存 代码长度 提交时间
30742 LYLAKIOI 【S】T2 C++ 通过 100 217 MS 148800 KB 4048 2024-07-30 13:04:33

Tests(18/18):


#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 p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=1e6+10,mod=1e9+7; 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,q,dfn[maxn],siz[maxn],dep[maxn],C;vector<int>v[maxn]; struct node { int op,x,a,b; int tim_del; }d[maxn]; struct nd { int k,b; nd(){k=b=0;} nd(int _k,int _b){k=_k,b=_b;} }; nd operator+(nd a,nd b){ return nd((a.k+b.k)%mod,(a.b+b.b)%mod); } nd rev(nd x){return nd(mod-x.k,mod-x.b);} struct SegTree { struct node { nd lz; }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define lz(p) d[p].lz void cl(int p,nd x){lz(p)=lz(p)+x;} void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=nd(0,0);} void upd(int l,int r,int s,int t,int p,nd k){ if(l<=s&&t<=r){cl(p,k);return;}pd(p); int mid=s+t>>1; if(l<=mid)upd(l,r,s,mid,ls(p),k);if(r>=mid+1)upd(l,r,mid+1,t,rs(p),k); }nd qry(int l,int s,int t,int p){ if(s==t)return lz(p);pd(p); int mid=s+t>>1; if(l<=mid)return qry(l,s,mid,ls(p));return qry(l,mid+1,t,rs(p)); } #undef ls #undef rs #undef lz }T1,T2; struct SegTree2 {//min struct node { int lz;node(){lz=1e9;} }d[maxn<<2]; #define ls(p) (p<<1) #define rs(p) (p<<1|1) #define lz(p) d[p].lz void cl(int p,int x){lz(p)=min(lz(p),x);} void pd(int p){cl(ls(p),lz(p)),cl(rs(p),lz(p)),lz(p)=1e9;} void upd(int l,int r,int s,int t,int p,int x){ if(l<=s&&t<=r){cl(p,x);return;}pd(p); int mid=s+t>>1; if(l<=mid)upd(l,r,s,mid,ls(p),x);if(r>=mid+1)upd(l,r,mid+1,t,rs(p),x); }int qry(int l,int s,int t,int p){ if(s==t)return lz(p);pd(p); int mid=s+t>>1; if(l<=mid)return qry(l,s,mid,ls(p));return qry(l,mid+1,t,rs(p)); } }T; void dfs(int u){ dfn[u]=++C,siz[u]=1; for(int x:v[u])dep[x]=dep[u]+1,dfs(x),siz[u]+=siz[x]; } void upd(int x,int a,int b){ a=(a%mod+mod)%mod,b=(b%mod+mod)%mod; if(dep[x]&1){ auto it=nd(b,(a-b*1ll*dep[x]%mod+mod)%mod); T1.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it);it=rev(it); T2.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it); }else { auto it=nd(b,(a-b*1ll*dep[x]%mod+mod)%mod); T2.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it);it=rev(it); T1.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it); } } void del_upd(int x,int a,int b){ a=(a%mod+mod)%mod,b=(b%mod+mod)%mod; if(dep[x]&1){ auto it=nd(b,(a-b*1ll*dep[x]%mod+mod)%mod);it=rev(it); T1.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it);it=rev(it); T2.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it); }else { auto it=nd(b,(a-b*1ll*dep[x]%mod+mod)%mod);it=rev(it); T2.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it);it=rev(it); T1.upd(dfn[x],dfn[x]+siz[x]-1,1,n,1,it); } } int get_qry(int x){ nd kk; if(dep[x]&1)kk=T1.qry(dfn[x],1,n,1); else kk=T2.qry(dfn[x],1,n,1); return (kk.k*1ll*dep[x]%mod+kk.b)%mod; } vector<int>S[maxn]; void slv(){ n=read(),q=read(); up(i,2,n)v[read()].p_b(i); dep[1]=1;dfs(1); up(i,1,q){ d[i].op=read(),d[i].x=read(); if(d[i].op==1)d[i].a=read(),d[i].b=read(); }down(i,q,1){ if(d[i].op==3)T.upd(dfn[d[i].x],dfn[d[i].x]+siz[d[i].x]-1,1,n,1,i); if(d[i].op==1)d[i].tim_del=min(T.qry(dfn[d[i].x],1,n,1),q+1),S[d[i].tim_del].p_b(i); }up(i,1,q){ if(d[i].op==1)upd(d[i].x,d[i].a,d[i].b); else if(d[i].op==3){for(int x:S[i])del_upd(d[x].x,d[x].a,d[x].b);} else if(d[i].op==2)printf("%d\n",get_qry(d[i].x)); } }int main(){ slv(); fclose(stdin); fclose(stdout); return 0; }


测评信息: