Submission #1208544

#TimeUsernameProblemLanguageResultExecution timeMemory
1208544abczzBitaro, who Leaps through Time (JOI19_timeleap)C++20
0 / 100
361 ms90836 KiB
#include <iostream>
#include <array>
#define ll long long

using namespace std;

ll n, q, ty, a, b, c, d;
array<ll, 2> R[300000];

array<ll, 2> nx(ll x, array<ll, 5> a) {
  if (a[2] == -1e18) return {min(max(x, a[0]), a[1]), max(0LL, x-a[1])};
  else return {a[2], max(0LL, x-a[1])+max(0LL, min(max(x, a[0]), a[1])-a[4])+a[3]};
}
array<ll, 5> merge(array<ll, 5> a, array<ll, 5> b) {
  if (a[2] == -1e18) {
    if (max(a[0], b[0]) <= min(a[1], b[1])) return {max(a[0], b[0]), min(a[1], b[1]), b[2], b[3], b[4]};
    else if (b[2] == -1e18) return {a[0], a[1], (a[1] < b[0] ? b[0] : b[1]), 0, (a[1] < b[0] ? b[0] : b[1])};
    else return {a[0], a[1], b[2], b[3], (a[1] < b[0] ? b[0] : b[1])};
  }
  else {
    auto u = nx(a[2], b);
    return {a[0], a[1], u[0], a[3]+u[1], a[4]};
  }
}

array<ll, 2> cur;

struct SegTree{
  array<ll, 5> st[1200000];
  void build(ll id, ll l, ll r, ll w) {
    if (l == r) {
      st[id] = {R[l][0] + w * l, R[l][1] + w * l, -(ll)1e18, 0, -(ll)1e18};
      return;
    }
    ll mid = (l+r)/2;
    build(id*2, l, mid, w);
    build(id*2+1, mid+1, r, w);
    if (w == -1) st[id] = merge(st[id*2], st[id*2+1]);
    else st[id] = merge(st[id*2+1], st[id*2]);
  }
  void update(ll id, ll l, ll r, ll q, ll x, ll y, ll w) {
    if (l == r) {
      st[id] = {x + w * l, y + w * l, -(ll)1e18, 0, -(ll)1e18};
      return;
    }
    ll mid = (l+r)/2;
    if (q <= mid) update(id*2, l, mid, q, x, y, w);
    else update(id*2+1, mid+1, r, q, x, y, w);
    if (w == -1) st[id] = merge(st[id*2], st[id*2+1]);
    else st[id] = merge(st[id*2+1], st[id*2]);
  }
  void query(ll id, ll l, ll r, ll ql, ll qr, ll w) {
    if (qr < l || r < ql) return;
    else if (ql <= l && r <= qr) {
      auto u = nx(cur[0], st[id]);
      cur = {u[0], u[1]+cur[1]};
      return;
    }
    ll mid = (l+r)/2;
    if (w == -1) {
      query(id*2, l, mid, ql, qr, w);
      query(id*2+1, mid+1, r, ql, qr, w);
    }
    else {
      query(id*2+1, mid+1, r, ql, qr, w);
      query(id*2, l, mid, ql, qr, w);
    }
  }
}ST1, ST2;
int main() {
  cin.tie(0);
  ios::sync_with_stdio(0);
  cin >> n >> q;
  for (int i=0; i<n-1; ++i) {
    cin >> R[i][0] >> R[i][1];
    --R[i][1];
  }
  ST1.build(1, 0, n-2, -1);
  ST2.build(1, 0, n-2, 1);
  while (q--) {
    cin >> ty;
    if (ty == 1) {
      cin >> a >> b >> c;
      --a;
      ST1.update(1, 0, n-2, a, b, c-1, -1);
      ST2.update(1, 0, n-2, a, b, c-1, 1);
    }
    else {
      cin >> a >> b >> c >> d;
      --a, --c;
      if (a == c) cout << max(0LL, b-d) << '\n';
      else if (a < c) {
        cur = {b-a, 0};
        ST1.query(1, 0, n-2, a, c-1, -1);
        cur[0] += c;
        cout << cur[1] + max(0LL, cur[0]-d) << '\n';
      }
      else {
        cur = {b+a-1, 0};
        ST2.query(1, 0, n-2, c, a-1, 1);
        cur[0] -= c-1;
        cout << cur[1] + max(0LL, cur[0]-d) << '\n';
      }
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...