Submission #632043

#TimeUsernameProblemLanguageResultExecution timeMemory
632043gagik_2007Fountain (eJOI20_fountain)C++17
100 / 100
691 ms52528 KiB
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <cmath> #include <ctime> #include <set> #include <map> #include <stack> #include <queue> #include <deque> #include <limits> #include <iomanip> #include <unordered_set> #include <unordered_map> #include <fstream> #include <random> using namespace std; typedef long long ll; typedef double ld; typedef ll itn; #define ff first #define ss second ll ttt; const ll INF = 1e18; const ll SAFEINF = 1e12; const ll MOD = 1e9 + 7; const ll MOD2 = 998244353; const ll MOD3 = 32768; const ll N = 100007; ll n, m, k; struct Vaz { int ind; ll c; ll d; int nxt; Vaz(int i, int vv, int dd) { ind = i; c = vv; d = dd; nxt = 0; } }; vector<Vaz>a; vector<pair<int,int>>g[200007]; ll dp[200007][20]; ll up[200007][20]; ll lg; void dfs(int v, int par = 0, ll val = SAFEINF) { //cout << v << endl; dp[v][0] = val; up[v][0] = par; for (int i = 0; i < g[v].size(); i++) { dfs(g[v][i].ff, v, g[v][i].ss); } } void calc() { for (int i = 1; i <= lg; i++) { for (int j = 0; j <= n; j++) { dp[j][i] = dp[j][i - 1] + dp[up[j][i - 1]][i - 1]; up[j][i] = up[up[j][i - 1]][i - 1]; } } } ll get_ans(int v, int c) { if (c <= 0)return v; for (int i = lg; i >= 0; i--) { //cout << v << " " << i << endl; if (c - dp[v][i] > 0) { c -= dp[v][i]; v = up[v][i]; if (v == 0)return v; } } return up[v][0]; } int main() { cin >> n >> m; lg = ceil(log2(n)); Vaz vaz(0, 0, 0); a.push_back(vaz); for (int i = 1; i <= n; i++) { ll x, y; cin >> x >> y; Vaz vaz(i, y, x); a.push_back(vaz); } set<pair<int, int>>cur; vector<pair<int, int>>to_del; for (int i = 1; i <= n; i++) { for (auto it = cur.begin(); it != cur.end(); it++) { if ((*it).ff < a[i].d) { a[(*it).ss].nxt = i; to_del.push_back((*it)); } else break; } for (auto x : to_del) { cur.erase(x); } to_del.clear(); cur.insert({ a[i].d,i }); } for (int i = 1; i <= n; i++) { //cout << a[i].nxt << "->" << i << endl; g[a[i].nxt].push_back({ i,a[a[i].nxt].c }); } dfs(0); calc(); /*for (int i = 0; i <= n; i++) { for (int j = 0; j <= lg; j++) { cout << dp[i][j] << " "; } cout << endl; } for (int i = 0; i <= n; i++) { for (int j = 0; j <= lg; j++) { cout << up[i][j] << " "; } cout << endl; }*/ for (int i = 0; i < m; i++) { ll v, r; cin >> r >> v; v -= a[r].c; cout << get_ans(r, v) << endl; } }

Compilation message (stderr)

fountain.cpp: In function 'void dfs(int, int, ll)':
fountain.cpp:59:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   59 |  for (int i = 0; i < g[v].size(); i++) {
      |                  ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...