Submission #1166872

#TimeUsernameProblemLanguageResultExecution timeMemory
1166872kilikumaSnowball (JOI21_ho_t2)C++20
100 / 100
1663 ms10048 KiB
#include <bits/stdc++.h>

#define int long long

using namespace std;

vector<int> w;

vector<tuple<int, int, int>> rightEvents;
vector<tuple<int, int, int>> leftEvents;

int tps(int l, int r) {

  if (l == r)
    return 0;

  if (l < r) {
    if (rightEvents.empty())
      return (int) (1e18);
    if (get<1>(rightEvents.back()) + l < r)
      return (int) (1e18);
    int lft = 0, rht = rightEvents.size() - 1, cible = 0;
    while (rht - lft > 1) {
      int mid = (lft + rht) / 2;
      if (get<1>(rightEvents[mid]) + l >= r)
        rht = mid;
      else
        lft = mid;
    }
    if (get<1>(rightEvents[lft]) + l >= r)
      cible = lft;
    else
      cible = rht;
    return get<2>(rightEvents[cible]) + (r - (get<0>(rightEvents[cible]) + l));
  }
  else {
    if (leftEvents.empty())
      return (int) (1e18);
    if (get<1>(leftEvents.back()) + l > r)
      return (int) (1e18);
    int lft = 0, rht = leftEvents.size() - 1, cible = 0;
    while (rht - lft > 1) {
      int mid = (lft + rht) / 2;
      if (get<1>(leftEvents[mid]) + l <= r)
        rht = mid;
      else
        lft = mid;
    }
    if (get<1>(leftEvents[lft]) + l <= r)
      cible = lft;
    else
      cible = rht;
    return get<2>(leftEvents[cible]) + (get<0>(leftEvents[cible]) + l - r);
  }

}

int rep(int l, int r) {

  int ans = 0;

  if (l < r) {
    int lft = l, rht = r - 1;
    while (rht - lft > 1) {
      int mid = (lft + rht) / 2;
      if (tps(l, mid + 1) < tps(r, mid))
        lft = mid;
      else
        rht = mid;
    }
    if (tps(l, lft + 1) < tps(r, lft))
      ans = max(ans, lft - l + 1);
    if (tps(l, rht + 1) < tps(r, rht))
      ans = max(ans, rht - l + 1);
  }
  else {
    int lft = r, rht = l - 1;
    while (rht - lft > 1) {
      int mid = (lft + rht) / 2;
      if (tps(r, mid + 1) <= tps(l, mid))
        lft = mid;
      else
        rht = mid;
    }
    if (tps(l, rht) < tps(r, rht + 1))
      ans = max(ans, l - rht);
    if (tps(l, lft) < tps(r, lft + 1))
      ans = max(ans, l - lft);
  }

  return ans;

}

signed main() {

  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);

  int n, q; cin >> n >> q;

  vector<int> x(n + 2, 0);

  for (int i = 1; i <= n; i ++)
    cin >> x[i];

  x[0] = - (int) (1e18);
  x[n + 1] = (int) (1e18);

  w.assign(q + 2, 0);

  for (int i = 1; i <= q; i ++)
    cin >> w[i];

  int posCur = 0, leftExt = 0, rightExt = 0, tpsCur = 0;

  for (int i = 1; i <= q; i ++) {
    if (w[i] > 0) {
      if (w[i] + posCur > rightExt) {
        rightEvents.push_back(make_tuple(rightExt, w[i] + posCur, tpsCur + (rightExt - posCur)));
        rightExt = w[i] + posCur;
      }
    }
    else {
      if (w[i] + posCur < leftExt) {
        leftEvents.push_back(make_tuple(leftExt, w[i] + posCur, tpsCur + (posCur - leftExt)));
        leftExt = w[i] + posCur;
      }
    }
    tpsCur += abs(w[i]);
    posCur += w[i];
  }

  for (int i = 1; i <= n; i ++) {
    cout << rep(x[i], x[i - 1]) + rep(x[i], x[i + 1]) << '\n';
  }

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...