Submission #783977

#TimeUsernameProblemLanguageResultExecution timeMemory
783977amirhoseinfar1385Sumtree (INOI20_sumtree)C++17
10 / 100
693 ms515240 KiB
#include<bits/stdc++.h> using namespace std; long long n,k; const long long maxn=2000000+10,maxm=5000000+10; vector<long long>adj[maxn],child[maxn]; long long par[maxn],val[maxn],link[maxn],wa[maxn],cnt[maxn],asd,timea=0,high[maxn],fact[maxm],revfact[maxm],mod=1e9+7; pair<long long,long long>stf[maxn]; long long kaf=(1<<19); struct segment{ set<pair<long long,long long>>seg[(1<<20)]; pair<long long,long long> get(long long i){ if(i==0){ return make_pair(0,0); } if((long long)seg[i].size()==0){ return get((i>>1)); } auto x=*seg[i].rbegin(); return max(get((i>>1)),x); } void del(long long i,long long l,long long r,long long tl,long long tr,long long w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ seg[i].erase(make_pair(high[w],w)); return ; } long long m=(l+r)>>1; del((i<<1),l,m,tl,tr,w); del((i<<1)^1,m+1,r,tl,tr,w); } void upd(long long i,long long l,long long r,long long tl,long long tr,long long w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ seg[i].insert(make_pair(high[w],w)); return ; } long long 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{ long long seg[(1<<20)]; long long pors(long long i,long long l,long long r,long long tl,long long tr){ if(l>r||l>tr||r<tl||tl>tr){ return 0; } if(l>=tl&&r<=tr){ return seg[i]; } long long m=(l+r)>>1; long long ret=pors((i<<1),l,m,tl,tr)+pors((i<<1)^1,m+1,r,tl,tr); return ret; } void upd(long long i,long long w){ if(i==0){ return ; } seg[i]+=w; upd((i>>1),w); } }segjam,segted; struct segres{ long long seg[(1<<20)]; segres(){ for(long long i=kaf;i<(1<<20);i++){ seg[i]=-1; } for(long long 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,long long w){ if(l>r||l>tr||r<tl||tl>tr){ return ; } if(l>=tl&&r<=tr){ w%=mod; 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(){ fact[0]=1; for(long long i=1;i<maxm;i++){ fact[i]=1ll*fact[i-1]*i%mod; } revfact[maxm-1]=mypow(fact[maxm-1],mod-2); for(long long i=maxm-2;i>=0;i--){ revfact[i]=1ll*revfact[i+1]*(i+1)%mod; } } long long c(long long i,long long j){ if(i<0||j<0||i<j){ return 0; } long long ret=1ll*fact[i]*revfact[j]%mod*revfact[i-j]%mod; return ret; } void dfs(long long u,long long 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){ child[u].push_back(x); dfs(x,u); cnt[u]+=cnt[x]; } } stf[u].second=timea; } long long hes(long long a,long long b){ a++; long long ret=c(b+a-1,a-1); return ret; } 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); link[1]=0; } int findp(int u,int av){ if(u==av||val[u]==-1){ return findp(par[u],av); } return u; } void upd(long long u,long long w){ wa[u]=w; val[u]=w; // long long pp=segbal.get(stf[u].first+kaf).second; long long pp=findp(u,u); long long jam=segjam.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); long long ted=cnt[u]-segted.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); segted.upd(kaf+stf[u].first,ted); // segbal.upd(1,0,kaf-1,stf[u].first+1,stf[u].second,u); segjam.upd(kaf+stf[u].first,-jam+w); long long jamp=segjam.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); long long tedp=cnt[pp]-segted.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); long long 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(long long u){ // long long pp=segbal.get(stf[u].first+kaf).second; long long pp=findp(u,u); long long jam=segjam.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); long long ted=cnt[u]-segted.pors(1,0,kaf-1,stf[u].first+1,stf[u].second); segted.upd(kaf+stf[u].first,-ted); // segbal.del(1,0,kaf-1,stf[u].first+1,stf[u].second,u); segjam.upd(kaf+stf[u].first,+jam-wa[u]); long long jamp=segjam.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); long long tedp=cnt[pp]-segted.pors(1,0,kaf-1,stf[pp].first+1,stf[pp].second); long long fake=hes(tedp-1,val[pp]-jamp); res.upd(1,0,kaf-1,stf[pp].first,stf[pp].first,-1); 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); val[u]=-1; } int main(){ ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); aval(); cin>>n>>k; for(long long i=0;i<n-1;i++){ long long u,v; cin>>u>>v; adj[u].push_back(v); adj[v].push_back(u); } dfs(1); segjam.upd(stf[1].first+kaf,k); val[1]=k; tof(); long long q; cin>>q; asd=1; cout<<res.seg[1]<<"\n"; for(;asd<=q;asd++){ long long qq; cin>>qq; if(qq==1){ long long u,w; cin>>u>>w; upd(u,w); } else{ long long 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...