제출 #1319958

#제출 시각아이디문제언어결과실행 시간메모리
1319958user736482Sumtree (INOI20_sumtree)C++20
70 / 100
3097 ms115192 KiB
#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;reverse(al(d[v]));
    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 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...