Submission #1256454

#TimeUsernameProblemLanguageResultExecution timeMemory
1256454random_nameFountain (eJOI20_fountain)C++20
100 / 100
308 ms22928 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; vector<pair<pair<ll, ll>, vector<ll>>> tree; vector<vector<ll>> which; vector<pair<ll, ll>> where; ll count_childs(vector<ll>* A, vector<vector<ll>>* B, ll n){ ll max_child = 0; for(ll edge: (*B)[n]){ max_child = max(max_child, count_childs(A, B, edge)); } (*A)[n] = max_child + 1; return max_child + 1; } ll querry(pair<ll, ll> n, ll w){ if(tree[n.first].second[n.second] < w){ if(tree[n.first].first.first == -1){ return 0; } return querry(tree[n.first].first, w - tree[n.first].second[n.second]); } return which[n.first][upper_bound(tree[n.first].second.begin(), tree[n.first].second.end(), tree[n.first].second[n.second] - w) - tree[n.first].second.begin()]; } int main(){ ll n, q; cin >> n >> q; vector<pair<ll, ll>> A(n); for(ll i = 0; i < n; i++){ cin >> A[i].first >> A[i].second; } vector<ll> br(n, -1); stack<ll> que; for(ll i = 0; i < n; i++){ while(!que.empty() && A[que.top()].first < A[i].first){ br[que.top()] = i; que.pop(); } que.push(i); } vector<vector<ll>> childs(n+1); for(ll i = 0; i < n; i++){ if(br[i] != -1) childs[br[i]+1].push_back(i+1); else childs[0].push_back(i+1); } vector<ll> child_counts(n+1); count_childs(&child_counts, &childs, 0); tree.push_back({{-1, -1}, vector<ll>(1, 0)}); which.push_back(vector<ll>(1, 0)); where.resize(n+1); while(!que.empty()) que.pop(); que.push(0); while(!que.empty()){ ll c = que.top(); que.pop(); ll max_child = -1; for(ll child: childs[c]){ if(max_child == -1 || child_counts[child] > child_counts[max_child]){ max_child = child; } } if(max_child == -1){ continue; } for(ll child: childs[c]){ if(child == max_child) continue; que.push(child); where[child] = {tree.size(), 0}; tree.push_back({where[c], {A[child-1].second}}); which.push_back({{child}}); } que.push(max_child); // cout << c << endl; where[max_child] = {where[c].first, tree[where[c].first].second.size()}; // cout << tree.size() << ' ' << where[c].first << ' ' << max_child << endl; tree[where[c].first].second.push_back(A[max_child-1].second + tree[where[c].first].second.back()); which[where[c].first].push_back(max_child); } while(q--){ ll x, y; cin >> x >> y; cout << querry(where[x], y) << '\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...