Submission #506109

#TimeUsernameProblemLanguageResultExecution timeMemory
506109ryangohcaBitaro, who Leaps through Time (JOI19_timeleap)C++17
100 / 100
744 ms91032 KiB
#include <bits/stdc++.h> #define pii pair<int, int> #define ti3 tuple<int, int, int> #define ti4 tuple<int, int, int, int> #define int long long // lalalalalalala, you flood into me, slowly from over the horizon ~ Seunghee, The Fifth Season (SSFWL) using namespace std; struct dat{ int lTime, rTime, timeUsed, powers; dat(): lTime(0), rTime(0), timeUsed(0), powers(0){} dat(int a, int b, int c, int d): lTime(a), rTime(b), timeUsed(c), powers(d){} dat operator +(const dat &oth){ dat ans; ans.timeUsed = timeUsed + oth.timeUsed; ans.powers = powers + oth.powers; int lrch = lTime + timeUsed, rrch = rTime + timeUsed; if (max(lrch, oth.lTime) <= min(rrch, oth.rTime)){ // in some interval on left node, we can reach the right node on time. ans.lTime = max(lrch, oth.lTime) - timeUsed; ans.rTime = min(rrch, oth.rTime) - timeUsed; } else if (oth.lTime > rrch){ // right node opens too late, need to wait // better for interval to start as late as possible, bcos waiting better than using powers ans.lTime = rTime; ans.rTime = rTime; ans.timeUsed += oth.lTime - rrch; } else { // right node closes too early, need to use powers // better for interval to start as early as possible to use less powers ans.powers += lrch - oth.rTime; ans.timeUsed -= lrch - oth.rTime; ans.lTime = ans.rTime = lTime; } return ans; } }; vector<pii> v; struct node{ int s, e, m; dat lft, rgt; node *l, *r; node(int s, int e): s(s), e(e), m((s+e)/2){ if (s == e){ lft = dat(v[s].first, v[s].second, 1, 0); rgt = dat(v[s].first, v[s].second, 1, 0); } else { l = new node(s, m); r = new node(m+1, e); lft = l->lft + r->lft; rgt = r->rgt + l->rgt; } } void upd(int idx){ if (s == e){ lft = dat(v[s].first, v[s].second, 1, 0); rgt = dat(v[s].first, v[s].second, 1, 0); return; } else if (idx <= m) l->upd(idx); else r->upd(idx); lft = l->lft + r->lft; rgt = r->rgt + l->rgt; } dat query(int x, int y, bool islft){ if (s==x && e==y) return (islft?lft:rgt); else if (y <= m) return l->query(x, y, islft); else if (x > m) return r->query(x, y, islft); else { if (islft) return l->query(x, m, islft) + r->query(m+1, y, islft); else return r->query(m+1, y, islft) + l->query(x, m, islft); } } } *root; main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, q; cin >> n >> q; v.push_back({69, 420}); // dummy for (int i = 1; i < n; i++){ int a, b; cin >> a >> b; v.push_back({a, b-1}); } if (n > 1) root = new node(1, n-1); while (q--){ int t; cin >> t; if (t == 1){ int x, a, b; cin >> x >> a >> b; v[x] = {a, b-1}; if (n > 1) root->upd(x); } else { int st, l, en, r; cin >> st >> l >> en >> r; if (st == en){ if (r < l) cout << l-r << '\n'; else cout << "0\n"; continue; } bool islft = true; if (en < st){ swap(en, st); //swap(l, r); islft = false; } dat ans = root->query(st, en-1, islft); int st_time = max(ans.lTime, l); //cout << ans.timeUsed << endl; if (ans.rTime < l){ ans.powers += l-ans.rTime; st_time = ans.rTime; } int end_time = st_time + ans.timeUsed; if (r < end_time){ ans.powers += end_time - r; } cout << ans.powers << '\n'; } } }

Compilation message (stderr)

timeleap.cpp:73:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   73 | main(){
      | ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...