#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define pii pair<ll,ll>
#define vi vector<ll>
#define vii vector<pii>
#define ff first
#define ss second
#define al(x) x.begin(),x.end()
#define rev(x) reverse(al(x))
#define MOD 1000000007
#define POT (1LL<<20)
#define INF 1000000099LL
#define INFL INF*INF
ll fct[1000007],ifct[1000007],inv[1000007];
vi g[200007],d[200007];
ll anab(ll a,ll b){//cout<<a<<" "<<b<<"\n";
if(a<0)return 0;
return ((fct[a+b-1]*ifct[a])%MOD*ifct[b-1])%MOD;
}
ll ianab(ll a,ll b){//cout<<a<<" "<<b<<"i\n";
if(a<0)return 0;
return ((ifct[a+b-1]*fct[a])%MOD*fct[b-1])%MOD;
}
ll n,r,q,a,b,c,rs,ilz=0;
void pmnz(ll x){
if(x==0)ilz++;else rs=(rs*x)%MOD;
}
void pdz(ll x){
if(x==0)ilz--;else rs=(rs*x)%MOD;
}
ll gt(){//cout<<ilz<<" ";
if(ilz)return 0;return rs;
}
ll pre[200007],mxpre[200007],sz[200007],mj[200007],pop[200007],co[200007],ak=0;
ll sg[POT][2];
ll val[200007];
void dod(ll v,ll x,ll id){
v+=POT/2-1;
while(v){
sg[v][id]+=x;v/=2;
}
}
ll sm(ll v,ll l,ll r,ll pocz,ll kon,ll id){
if(l>kon || r<pocz)return 0;
if(l>=pocz && r<=kon)return sg[v][id];
return sm(v*2,l,(l+r)/2,pocz,kon,id)+sm(v*2+1,(l+r)/2+1,r,pocz,kon,id);
}
void dpre(ll v,ll p){
sz[v]=1;
for(ll i:g[v])if(i^p){dpre(i,v);sz[v]+=sz[i];d[v].pb(i);}
for(ll i=0;i<(ll)d[v].size()-1;i++){
if(sz[d[v][i]]>sz[d[v].back()])swap(d[v][i],d[v].back());
}
reverse(al(d[v]));
}
void dfs(ll v,ll p){
pre[v]=++ak;co[ak]=v;for(ll i:d[v])dfs(i,v);
mxpre[v]=ak;
}
void df2(ll v,ll x){
mj[v]=x;
if(d[v].size())df2(d[v][0],x);
for(ll i=1;i<d[v].size();i++)df2(d[v][i],d[v][i]),pop[d[v][i]]=x;
}
set<ll>s[200007];ll mn[200007];
void upd(ll v){
ll x=mj[v],y=pre[v];
if(s[x].find(y)==s[x].end()){
s[x].insert(y);
}
else s[x].erase(y);
mn[x]=*s[x].begin();
}
ll mjpar(ll v){
ll sp=mj[v];
while(mn[sp]>pre[v])sp=pop[sp];
ll x=*--s[sp].lower_bound(pre[v]+1);
return co[x];
}
int main(){ios_base::sync_with_stdio(0);cin.tie(0);
inv[1]=fct[1]=ifct[1]=fct[0]=ifct[0]=1;
for(ll i=2;i<1000007;i++){
inv[i]=MOD-(MOD/i*inv[MOD%i])%MOD;
fct[i]=(fct[i-1]*i)%MOD;
ifct[i]=(ifct[i-1]*inv[i])%MOD;
}
cin>>n>>r;
rs=anab(r,n);
val[1]=r;
cout<<rs<<"\n";
for(ll i=1;i<n;i++){
cin>>a>>b;
g[a].pb(b);g[b].pb(a);
}
dpre(1,1);
dfs(1,1);
for(ll i=1;i<=n;i++){s[i].insert(INFL);mn[i]=INFL;}
df2(1,1);
upd(1);
//cout<<pre[4]<<"\n";
cin>>q;
for(ll i=0;i<q;i++){
cin>>a;
if(a==1){
cin>>b>>c;
ll pr=mjpar(b);
ll jg=sz[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],0),jgs=val[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],1);
ll moje=sz[b]-sm(1,1,POT/2,pre[b]+1,mxpre[b],0),mojes=c-sm(1,1,POT/2,pre[b]+1,mxpre[b],1);
//cout<<pr<<" "<<jg<< " "<<moje<<" "<<jgs<<" "<<mojes<<"\n";
pdz(ianab(jgs,jg));
pmnz(anab(jgs-mojes,jg-moje));
pmnz(anab(mojes,moje));
val[b]=c;
dod(pre[b],moje,0);
dod(pre[pr],-moje,0);
dod(pre[b],mojes,1);
dod(pre[pr],-mojes,1);
upd(b);
}
else{
cin>>b;
upd(b);
ll pr=mjpar(b);
ll jg=sz[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],0),jgs=val[pr]-sm(1,1,POT/2,pre[pr]+1,mxpre[pr],1);
ll moje=sz[b]-sm(1,1,POT/2,pre[b]+1,mxpre[b],0),mojes=val[b]-sm(1,1,POT/2,pre[b]+1,mxpre[b],1);
jg+=moje;jgs+=mojes;
dod(pre[pr],mojes,1);
dod(pre[b],-mojes,1);
dod(pre[pr],moje,0);
dod(pre[b],-moje,0);
val[b]=0;
pmnz(anab(jgs,jg));
pdz(ianab(jgs-mojes,jg-moje));
pdz(ianab(mojes,moje));
}
cout<<gt()<<"\n";
}
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |