Submission #668011

#TimeUsernameProblemLanguageResultExecution timeMemory
668011haxormanFountain (eJOI20_fountain)C++14
100 / 100
383 ms50380 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int mxN = 2e5 + 7; int sparse[20][mxN], dist[20][mxN], h[mxN]; pair<int,int> arr[mxN]; vector<pair<int,int>> graph[mxN]; void dfs(int u, int par, int weight) { sparse[0][u] = (par == -1 ? 0 : par); dist[0][u] = weight; h[u] = (par == -1 ? -1 : h[par]) + 1; for (int i = 1; i < 20; ++i) { sparse[i][u] = sparse[i - 1][sparse[i - 1][u]]; dist[i][u] = dist[i - 1][u] + dist[i - 1][sparse[i - 1][u]]; } for (auto p : graph[u]) { int v = p.first, w = p.second; dfs(v, u, w); } } int32_t main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; for (int i = 1; i <= n; ++i) { cin >> arr[i].first >> arr[i].second; } vector<int> st; for (int i = 1; i <= n; ++i) { while (st.size() && arr[i].first > arr[st.back()].first) { graph[i].push_back({st.back(), arr[st.back()].second}); st.pop_back(); } st.push_back(i); } while (st.size()) { graph[0].push_back({st.back(), arr[st.back()].second}); st.pop_back(); } dfs(0, -1, 0); while (q--) { int ind, val; cin >> ind >> val; for (int i = 19; i >= 0 && val; --i) { if (dist[i][ind] && dist[i][ind] < val) { val -= dist[i][ind]; ind = sparse[i][ind]; } } cout << ind << "\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...