Submission #784105

#TimeUsernameProblemLanguageResultExecution timeMemory
784105amirhoseinfar1385Sumtree (INOI20_sumtree)C++17
100 / 100
1602 ms262248 KiB
#include<bits/stdc++.h> using namespace std; int n,k; const int maxn=200000+10,maxm=500000+10; vector<int>adj[maxn]; int par[maxn],val[maxn],cnt[maxn],asd,timea=0,high[maxn],fact[maxm],revfact[maxm],mod=1e9+7; pair<int,int>stf[maxn]; int kaf=(1<<19); struct cmp { bool operator() (int a, int b) const { return high[a]<high[b]; } }; struct segment{ set<int,cmp>seg[(1<<20)]; int get(int i){ if(i==0){ return 0; } if((int)seg[i].size()==0){ return get((i>>1)); } auto x=*seg[i].rbegin(); int z=get((i>>1)); if(high[z]>high[x]){ return z; } else{ return x; } } void del(int i,int l,int r,int tl,int tr,int w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ seg[i].erase(w); return ; } int m=(l+r)>>1; del((i<<1),l,m,tl,tr,w); del((i<<1)^1,m+1,r,tl,tr,w); } void upd(int i,int l,int r,int tl,int tr,int w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ seg[i].insert(w); return ; } int m=(l+r)>>1; upd((i<<1),l,m,tl,tr,w); upd((i<<1)^1,m+1,r,tl,tr,w); } }segbal; struct segjam{ int seg[(1<<20)]; int pors(int i,int l,int r,int tl,int tr){ if(l>r||l>tr||r<tl||tl>tr){ return 0; } if(l>=tl&&r<=tr){ return seg[i]; } int m=(l+r)>>1; int ret=pors((i<<1),l,m,tl,tr)+pors((i<<1)^1,m+1,r,tl,tr); return ret; } void upd(int i,int w){ if(i==0){ return ; } seg[i]+=w; upd((i>>1),w); } }segjam,segted; struct segres{ int seg[(1<<20)]; segres(){ for(int i=kaf;i<(1<<20);i++){ seg[i]=-1; } for(int i=1;i<kaf;i++){ seg[i]=-1; } } void calc(int i){ if(seg[(i<<1)]==-1&&seg[(i<<1)^1]==-1){ seg[i]=-1; return ; } if(seg[(i<<1)]==-1){ seg[i]=seg[(i<<1)^1]; return ; } if(seg[(i<<1)^1]==-1){ seg[i]=seg[(i<<1)]; return ; } seg[i]=1ll*seg[(i<<1)^1]*seg[(i<<1)]%mod; return ; } void upd(int i,int l,int r,int tl,int tr,int w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ seg[i]=w; return ; } int m=(l+r)>>1; upd((i<<1),l,m,tl,tr,w); upd((i<<1)^1,m+1,r,tl,tr,w); calc(i); } }res; long long mypow(long long m,long long y){ if(y==0){ return 1; } long long p=mypow(m,(y>>1)); p*=p; p%=mod; if(y&1){ p*=m; p%=mod; } return p; } void aval(){ for(int i=0;i<maxn;i++){ val[i]=-1; } fact[0]=1; for(int i=1;i<maxm;i++){ fact[i]=1ll*fact[i-1]*i%mod; } revfact[maxm-1]=mypow(fact[maxm-1],mod-2); for(int i=maxm-2;i>=0;i--){ revfact[i]=1ll*revfact[i+1]*(i+1)%mod; } } inline int c(int i,int j){ if(i<0||j<0||i<j){ return 0; } int ret=1ll*fact[i]*revfact[j]%mod*revfact[i-j]%mod; return ret; } void dfs(int u,int para=0){ cnt[u]=1; high[u]=high[para]+1; timea++; stf[u].first=timea; par[u]=para; for(auto x:adj[u]){ if(x!=para){ dfs(x,u); cnt[u]+=cnt[x]; } } stf[u].second=timea; } inline int hes(int a,int b){ a++; int ret=c(b+a-1,a-1); return ret; } void upd(int u,int w){ val[u]=w; int pp=segbal.get(stf[u].first+kaf); int jam=segjam.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); int ted=cnt[u]-segted.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); segted.upd(kaf+stf[u].first,ted); segted.upd(kaf+stf[pp].first,-ted); segbal.upd(1,0,kaf-1,stf[u].first+1,stf[u].second,u); segjam.upd(kaf+stf[u].first,-jam+w); segjam.upd(kaf+stf[pp].first,+jam-w); int jamp=segjam.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); int tedp=cnt[pp]-segted.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); int fake=hes(tedp-1,val[pp]-jamp); res.upd(1,0,kaf-1,stf[pp].first,stf[pp].first,fake); fake=hes(ted-1,val[u]-jam); res.upd(1,0,kaf-1,stf[u].first,stf[u].first,fake); } void del(int u){ int pp=segbal.get(stf[u].first+kaf); int jam=segjam.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); int ted=cnt[u]-segted.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); segted.upd(kaf+stf[u].first,-ted); segted.upd(kaf+stf[pp].first,+ted); segbal.del(1,0,kaf-1,stf[u].first+1,stf[u].second,u); segjam.upd(kaf+stf[u].first,+jam-val[u]); segjam.upd(kaf+stf[pp].first,-jam+val[u]); val[u]=-1; int jamp=segjam.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); int tedp=cnt[pp]-segted.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); int fake=hes(tedp-1,val[pp]-jamp); res.upd(1,0,kaf-1,stf[pp].first,stf[pp].first,fake); res.upd(1,0,kaf-1,stf[u].first,stf[u].first,-1); } void tof(){ res.upd(1,0,kaf-1,stf[1].first,stf[1].first,hes(n-1,val[1])); segbal.upd(1,0,kaf-1,stf[1].first+1,stf[1].second,1); } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); aval(); cin>>n>>k; for(int i=0;i<n-1;i++){ int u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } dfs(1); val[1]=k; tof(); int q; cin>>q; asd=1; cout<<res.seg[1]<<"\n"; for(;asd<=q;asd++){ int qq; cin>>qq; if(qq==1){ int u,w; cin>>u>>w; upd(u,w); } else{ int u; cin>>u; del(u); } cout<<res.seg[1]<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...