Submission #1171519

#TimeUsernameProblemLanguageResultExecution timeMemory
1171519M_W_13Bitaro, who Leaps through Time (JOI19_timeleap)C++20
0 / 100
556 ms62616 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i, n) for (int i = 0; i < (n); i++) #define st first #define nd second #define pb push_back const ll INF = 1e18; const int MAXN = 1 << 19; struct wi { ll fi; ll kiedy; ll mus; ll zapas; ll rozm; }; wi dp[2 * MAXN][2]; wi wyznacz(wi a, wi b) { wi w; w.rozm = a.rozm + b.rozm; w.fi = a.fi; w.mus = a.mus; ll mom = a.kiedy; if (a.kiedy <= b.fi) { w.kiedy = b.kiedy; w.mus += b.mus; w.zapas = min(a.zapas, b.zapas + max(0ll, b.fi - a.kiedy)); return w; } ll r = a.kiedy - b.fi; if (r <= b.zapas) { w.kiedy = b.kiedy + r; w.zapas = min(a.zapas, b.zapas - r); return w; } // cout << "TO = " << b.rozm << '\n'; ll roz = r - b.zapas; w.mus += roz; w.mus += b.mus; w.kiedy = max(b.kiedy, b.fi + b.zapas + b.rozm - b.mus); w.zapas = 0ll; return w; } void upd0(int v, wi x) { v += MAXN; dp[v][0] = x; v /= 2; while (v > 0) { dp[v][0] = wyznacz(dp[2 * v][0], dp[2 * v + 1][0]); v /= 2; } } void upd1(int v, wi x) { v += MAXN; dp[v][1] = x; v /= 2; while (v > 0) { dp[v][1] = wyznacz(dp[2 * v + 1][1], dp[2 * v][1]); v /= 2; } } vector<wi> query0(int l, int r) { vector<wi> v1; vector<wi> v2; l += MAXN; r += MAXN; while (l < r) { if (l % 2 == 1) { v1.pb(dp[l][0]); l++; } if (r % 2 == 0) { v2.pb(dp[r][0]); r--; } l /= 2; r /= 2; } if (l == r) { v1.pb(dp[l][0]); } vector<wi> v; int sz1 = v1.size(); int sz2 = v2.size(); rep(i, sz1) { v.pb(v1[i]); } for (int i = sz2 - 1; i >= 0; i--) { v.pb(v2[i]); } return v; } vector<wi> query1(int l, int r) { vector<wi> v1; vector<wi> v2; l += MAXN; r += MAXN; while (l < r) { if (l % 2 == 1) { v1.pb(dp[l][1]); l++; } if (r % 2 == 0) { v2.pb(dp[r][1]); r--; } l /= 2; r /= 2; } if (l == r) { v1.pb(dp[l][1]); } vector<wi> v; int sz1 = v1.size(); int sz2 = v2.size(); rep(i, sz2) { v.pb(v2[i]); } for (int i = sz1 - 1; i >= 0; i--) { v.pb(v1[i]); } return v; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, q; cin >> n >> q; pair<ll, ll> pom[n]; wi T[n]; rep(i, n - 1) { cin >> pom[i].st >> pom[i].nd; T[i].fi = pom[i].st; T[i].kiedy = pom[i].st + 1; T[i].zapas = pom[i].nd - pom[i].st - 1; T[i].mus = 0ll; T[i].rozm = 1ll; upd0(i, T[i]); upd1(i, T[i]); } wi A; rep(cos, q) { int t; cin >> t; if (t == 1) { int p; ll s, e; cin >> p >> s >> e; p--; T[p].fi = s; T[p].kiedy = s + 1; T[p].zapas = e - s - 1; T[p].mus = 0ll; T[p].rozm = 1ll; upd0(p, T[p]); upd1(p, T[p]); } else { int a, c; ll b, d; cin >> a >> b >> c >> d; a--; c--; wi X; X.fi = b; X.kiedy = b; X.mus = 0ll; X.zapas = INF; X.rozm = 0ll; if (a <= c) { c--; if (a <= c) { vector<wi> vec = query0(a, c); int sz = vec.size(); rep(i, sz) { // cout << vec[i].fi << " " << vec[i].kiedy << " " << vec[i].mus << " " << vec[i].zapas << '\n'; X = wyznacz(X, vec[i]); // cout << X.fi << " " << X.kiedy << " " << X.mus << " " << X.zapas << '\n'; } } } else { a--; if (a >= c) { vector<wi> vec = query1(c, a); int sz = vec.size(); rep(i, sz) { X = wyznacz(X, vec[i]); } } } // while (a > c) { // wi droga = T[a - 1]; // X = wyznacz(X, droga); // a--; // } // while (a < c) { // wi droga = T[a]; // X = wyznacz(X, droga); // a++; // } ll ans = max(0ll, X.kiedy - d); ans += X.mus; cout << ans << '\n'; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...