Submission #1262003

#TimeUsernameProblemLanguageResultExecution timeMemory
1262003user736482Two Currencies (JOI23_currencies)C++20
100 / 100
3805 ms58180 KiB
#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define ld long double
#define pb push_back
#define ff first
#define ss second
#define MOD 1000000007 
#define INF 1000000019
#define POT (1<<20)
#define INFL 1000000000000000099
#define X 17
ll pre[100007],mxpre[100007];
ll ans[100007];
ll n,a,b,c,m,q;
ll ak=1;
ll par[100007][X];
vector<ll>g[100007];
vector<pair<ll,ll>>ch;
vector<pair<pair<ll,ll>,ll>>zap;
ll pocz[100007],kon[100007],ilekup[100007],ilezap[100007];
ll sg[POT][2];
ll ilez[100007],iles[100007],dpt[100007];
void add(ll v,ll pocz,ll kon,ll l,ll r,ll x){
    if(r<pocz || l>kon)return;
    if(pocz<=l && kon>=r){sg[v][0]+=x;sg[v][1]++;}
    else{
        add(v*2,pocz,kon,l,(l+r)/2,x);
        add(v*2+1,pocz,kon,(l+r)/2+1,r,x);
    }
}
pair<ll,ll> gt(ll x){
    x=pre[x];
    x+=(POT/2-1);
    pair<ll,ll>odp={0,0};
    while(x){
        odp.ff+=sg[x][0];
        odp.ss+=sg[x][1];
        x/=2;
    }
    return odp;
}
void dfs(ll v,ll pop,ll dp){
    if(pop!=v)
    dpt[v]+=dpt[pop];
    pre[v]=ak++;
    par[v][0]=pop;
    for(ll i : g[v]){
        if(i!=pop)dfs(i,v,dp+1);
    }
    mxpre[v]=ak-1;
}
void dfs2(ll v,ll pop){
    if(pop!=v)
    dpt[v]+=dpt[pop];

    for(ll i : g[v]){
        if(i!=pop)dfs2(i,v);
    }

}
bool bl(ll a,ll b){
    return pre[a]>=pre[b] && pre[a]<=mxpre[b];
}
ll lca(ll a,ll b){
    if(bl(a,b))return b;
    if(bl(b,a))return a;
    for(ll j=X-1;j>=0;j--){
        if(!bl(b,par[a][j]))a=par[a][j];
        if(!bl(a,par[b][j]))b=par[b][j];
    }
    return par[a][0];
}
pair<ll,ll>dod(pair<ll,ll>a,pair<ll,ll>b){
    return {a.ff+b.ff,a.ss+b.ss};
}
pair<ll,ll>ode(pair<ll,ll>a,pair<ll,ll>b){
    return {a.ff-b.ff,a.ss-b.ss};
}
int main(){
    cin>>n>>m>>q;
    vector<pair<ll,ll>>e;
    for(ll i=1;i<n;i++){
        cin>>a>>b;
        e.pb({a,b});
        g[a].pb(b);
        g[b].pb(a);
    }
    dfs(1,1,0);
    for(ll i=0;i<m;i++){
        cin>>a>>b;
        a--;
        if(par[e[a].ff][0]==e[a].ss)
        ch.pb({b,e[a].ff});
        else ch.pb({b,e[a].ss});
        dpt[ch.back().ss]++;
        //cout<<ch.back().ff<<" "<<ch.back().ss<<"\n";
    }
    dfs2(1,1);
    //cout<<"xd"<<flush;
    sort(ch.begin(),ch.end());
    for(ll i=0;i<q;i++){
        cin>>a>>b;
        cin>>ilez[i]>>iles[i];
        zap.pb({{a,b},i});
        pocz[i]=0;
        kon[i]=1e9;
    }
    
    for(ll j=1;j<X;j++){
        for(ll i=1;i<=n;i++){
            par[i][j]=par[par[i][j-1]][j-1];
        }
    }
    
    for(ll k=0;k<31;k++){
        vector<pair<ll,ll>>op;//kiedy,idx || kiedy,-koszt
        for(auto i : zap)op.pb({(pocz[i.ss]+kon[i.ss])/2,i.ss});
        for(auto i : ch){
            op.pb({i.ff,-i.ss});
        }
        sort(op.begin(),op.end());
        for(ll j=1;j<POT;j++)sg[j][0]=sg[j][1]=0;
        for(auto i : op){
            
            //cout<<i.ff<<" "<<i.ss<<endl;
            if(i.ss<0){
                i.ss*=-1;
                //cout<<pre[i.ss]<<" "<<mxpre[i.ss]<<"\n";
                add(1,pre[i.ss],mxpre[i.ss],1,POT/2,i.ff);
                
            }
            else{
                ll a=zap[i.ss].ff.ff;
                ll b=zap[i.ss].ff.ss;
                ll lc=lca(a,b);
                //cout<<a<<" "<<b<<" "<<lc<<"\n";
                pair<ll,ll>mj=dod(gt(a),ode(gt(b),dod(gt(lc),gt(lc))));
                //cout<<mj.ff<<" "<<mj.ss<<"x\n";
                if(mj.ff>iles[i.ss]){
                    kon[i.ss]=i.ff;
                    ilekup[i.ss]=mj.ss;
                    ilezap[i.ss]=mj.ff;
                }
                else{
                    if(i.ff==1e9){
                        ilekup[i.ss]=mj.ss;
                    ilezap[i.ss]=mj.ff;
                    }
                    pocz[i.ss]=i.ff+1;
                }

            }
        }
        //cout<<"\n";
    }
    //cout<<dpt[3]<<" ";
    for(ll i=0;i<q;i++){
       // cout<<ilezap[i]<<" "<<iles[i]<<" "<<pocz[i]<<"\n";
        ll x=max(0LL,(ilezap[i]-iles[i]+pocz[i]-1)/pocz[i]);
        //cout<<dpt[zap[i].ff.ff]<<" "<<dpt[zap[i].ff.ss]<<" "<<2*dpt[lca(zap[i].ff.ff,zap[i].ff.ss)]<<" "<<lca(zap[i].ff.ff,zap[i].ff.ss)<<" "<<zap[i].ff.ff<<"\n";
        ll y=(dpt[zap[i].ff.ff]+dpt[zap[i].ff.ss]-2*dpt[lca(zap[i].ff.ff,zap[i].ff.ss)]);
        //cout<<x<<" "<<y<<" "<<ilekup[i]<<"\n";
        x=y+x-ilekup[i];;
        if(x>ilez[i])cout<<-1<<"\n";
        else cout<<ilez[i]-x<<"\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...