Submission #1273548

#TimeUsernameProblemLanguageResultExecution timeMemory
1273548serainaFountain (eJOI20_fountain)C++20
0 / 100
134 ms56388 KiB
#include <bits/stdc++.h>

using ll = long long;
using namespace std;

vector<ll>pre;
vector<ll>post;
vector<vector<ll>>g;
vector<vector<ll>>up;
vector<vector<ll>>cap;
vector<pair<ll,ll>>s;
vector<bool>vis;
ll timer=0;
ll current=0;

void dfs(ll v, ll p){
    vis[v]=true;
    pre[v]=timer++;
    up[v][0]=p;
    cap[v][0]=cap[p][0]+s[v+1].second;
    for(ll i=1; i<25; i++){
        up[v][i]=up[up[v][i-1]][i-1];
        cap[v][i]=cap[v][i-1]+cap[up[v][i-1]][i-1];
    }
    for(ll u:g[v]){
        if(u!=p){
            dfs(u,v);
        }
    }
    post[v]=timer++;
}

ll lca(ll v, ll c){
    for(ll i=24; i>=0; i--){
        if(cap[v][i]<=c){
            current=cap[v][i];
            v=up[v][i];
        }
    }
    return v;
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    
    ll n,q;
    cin>>n>>q;
    pre.resize(n);
    post.resize(n);
    up.resize(n,vector<ll>(25,0));
    cap.resize(n,vector<ll>(25,0));
    g.resize(n);
    s.resize(n+1,{0,0});
    vis.resize(n,false);

    for(ll i=1; i<=n; i++){
        cin>>s[i].first>>s[i].second;
    }
    for(ll i=1; i<n+1; i++){
        for(ll j=i+1; j<n+1; j++){
            if(s[i].first<s[j].first){
                g[i-1].push_back(j-1);
                g[j-1].push_back(i-1);
                break;
            }
        }
    }
    for(ll i=0; i<n; i++){
        if(!vis[i] && g[i].size()>0) dfs(i,0);
    }
    for(ll i=0; i<q; i++){
        ll a,b;
        cin>>a>>b;
        ll res=lca(a-1,b);
        if(current<b){
            cout<<0<<'\n';
            continue;
        }
        cout<<res+1<<'\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...