Submission #1311719

#TimeUsernameProblemLanguageResultExecution timeMemory
1311719darkdevilvaqifFountain (eJOI20_fountain)C++20
100 / 100
166 ms22352 KiB
/* _ __ __ __ ____ ___ _ __ | | /| / / ___ _ / /_ ____ / / / __ \ ___ ___ / _ \ (_) ___ ____ ___ / / | |/ |/ / / _ `// __// __/ / _ \ / /_/ / / _ \/ -_) / ___/ / / / -_)/ __// -_) /_/ |__/|__/ \_,_/ \__/ \__/ /_//_/ \____/ /_//_/\__/ /_/ /_/ \__/ \__/ \__/ (_) */ #pragma GCC optimize("O3") #pragma GCC optimize ("unroll-loops") // #pragma GCC target("avx2") #include <bits/stdc++.h> #define ll long long #define ull unsigned ll #define ld long double #define all(v, l) v.begin() + l, v.end() #define rall(v, l) v.rbegin(), v.rend() - l #define pb push_back #define rsz resize #define fi first #define se second #define LMAX LLONG_MAX #define LMIN LLONG_MIN #define IMAX INT_MAX #define IMIN INT_MIN #define endl "\n" #define newline cout << endl; using namespace std; // constants const int LOG = 20; // functions int GCD(int A, int B); int LCM(int A, int B); int power(int base, int exponent); // structs struct node { int P, S; }; struct graph { vector <vector <node> > up; void prep(int n) { up.assign(n + 1, vector <node>(LOG, {0, 0})); } void build() { for (int k = 1; k < LOG; k++) { for (int v = 1; v < (int)up.size(); v++) { int u = up[v][k - 1].P; if (!u) { up[v][k] = {0, up[v][k - 1].S}; continue; } up[v][k].P = up[u][k - 1].P; up[v][k].S = (up[v][k - 1].S == IMAX || up[u][k - 1].S == IMAX ? IMAX : up[v][k - 1].S + up[u][k - 1].S); } } } int ask(int v, int x, vector <int>&vals) { if (x <= vals[v]) { return v; } x -= vals[v]; int u = v; for (int k = LOG - 1; k >= 0; k--) { if (up[u][k].P && up[u][k].S < x) { x -= up[u][k].S; u = up[u][k].P; } } return up[u][0].P; } }; // globals // variables int n, q; // iterators int i; // notes /* One piece on top! -stuff you should look for- * int overflow, array bounds * special cases (n=1?) * do something instead of nothing and stay organized * WRITE STUFF DOWN * DON'T GET STUCK ON ONE APPROACH continue - skip the rest in the loop */ void solve() { cin >> n >> q; array <vector <int>, 2> v; v[0].rsz(n + 1), v[1].rsz(n + 1); for (i = 1; i <= n; i++) { cin >> v[0][i] >> v[1][i]; } graph G; G.prep(n + 1); { stack <int> st; for (i = 1; i <= n; i++) { while (!st.empty() && v[0][st.top()] < v[0][i]) { G.up[st.top()][0] = {i, v[1][i]}; st.pop(); } st.push(i); } while (!st.empty()) { G.up[st.top()][0] = {0, IMAX}; st.pop(); } } G.build(); while (q--) { int k, x; cin >> k >> x; cout << G.ask(k, x, v[1]) << endl; } } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; // cin >> t; while (t--) { solve(); newline } } int GCD(int A, int B) { if (!A) { return B; } return GCD(B % A, A); } int LCM(int A, int B) { return A * B / GCD(A, B); } int power(int base, int exponent) { int res = 1; while (exponent) { if (exponent & 1) { res *= base; } base *= base; exponent >>= 1; } return res; } /* $$$$$$$$\ $$$$$$$$\ $$ _____|\____$$ | $$ | $$ / $$$$$\ $$ / $$ __| $$ / $$ | $$ / $$$$$$$$\ $$$$$$$$\ \________|\________| */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...