Submission #1180853

#TimeUsernameProblemLanguageResultExecution timeMemory
1180853agussFountain (eJOI20_fountain)C++20
0 / 100
60 ms23804 KiB
#include <bits/stdc++.h>

#define dbg(x) cerr << #x << ": " << x << '\n';
#define dbgv(v) cerr << #v << ": "; for(auto &el : v) cerr << el << " "; cerr << '\n';

using namespace std;
using ll = long long;

bool test_cases = 0;
vector<int> diam, vol, vis;
vector<vector<int>> adj, up, up2;
int n, q, k = 3;
void dfs(int node, int prev = -1){
    up[node][0] = (prev == -1 ? 0 : vol[prev]);
    up2[node][0] = (prev == -1 ? node : prev);
    vis[node] = 1;
    for(int i = 1; i <= k; i++){
        up2[node][i] = up2[up2[node][i - 1]][i - 1];
        up[node][i] = up[up2[node][i - 1]][i - 1] + up[node][i - 1];
    }
    for(int &i : adj[node]){
        if(i == prev) continue;
        dfs(i, node);
    }
}
int query(int node, int vol2){
    int ans = 0;
    int actnode = node;
    int sum = vol2 - vol[node];
    if(sum == 0) return node + 1;
    for(int i = k; i >= 0; i--){
        if(node == up2[node][i]){
            if(sum < 0){
                break;
            }
            return 0;
        }
        /* dbg(up2[node][i]);
        dbg(up[node][i]);
        dbg(i); */
        if(sum - up[node][i] > 0){
            sum -= up[node][i];
            node = up2[node][i];
        } 
    }
    return up2[node][0] + 1; 
}
void solve(){
    cin >> n >> q;
    diam.assign(n, 0);
    vis.assign(n, 0);
    vol.assign(n, 0);
    adj.assign(n, vector<int>());
    up.assign(n, vector<int>(k + 1));
    up2.assign(n, vector<int>(k + 1));
    vector<pair<int, int>> idk;
    for(int i = 0; i < n; i++){
        cin >> diam[i] >> vol[i];
        idk.push_back({diam[i], i});
    } 
    stack<pair<int, int>> build;
    build.push({diam.back(), diam.size() - 1});
    for(int i = n - 1; i >= 0; i--){
        while(!build.empty() and diam[i] >= build.top().first){
            build.pop();
        }
        if(!build.empty()){ 
            adj[i].push_back(build.top().second);
            adj[build.top().second].push_back(i);
        }
        build.push({diam[i], i});
    }
    sort(idk.rbegin(), idk.rend());
    for(int i = 0; i < n; i++){
        if(vis[idk[i].second]) continue;
        dfs(idk[i].second);
    }
    while(q--){
        int start_node, lit;
        cin >> start_node >> lit;
        cout << query(--start_node, lit) << '\n';
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    if(test_cases){
        int t;
        cin >> t;
        for(int i = 0; i < t; i++){
            solve();
        }
        return 0;
    }
    solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...