Submission #579281

#TimeUsernameProblemLanguageResultExecution timeMemory
579281lumibonsTwo Antennas (JOI19_antennas)C++17
100 / 100
905 ms42244 KiB
#include <bits/stdc++.h>

using namespace std;

const int inf = 1e9 + 1;

struct sdata {
  int minhl = inf, maxhl = -inf, maxcost = -1;
};

struct operation {
  int minhr = inf, maxhr = -inf;
};

sdata combine(sdata dl, sdata dr) {
  return { min(dl.minhl, dr.minhl), max(dl.maxhl, dr.maxhl), max(dl.maxcost, dr.maxcost) };
}

sdata calculate(operation o, sdata d) {
  return { d.minhl, d.maxhl, max(d.maxcost, max(o.maxhr - d.minhl, d.maxhl - o.minhr)) };
}

operation merge(operation ot, operation ob) {
  return { min(ot.minhr, ob.minhr), max(ot.maxhr, ob.maxhr) };
}

const int sn = 1 << 18;
sdata s[2 * sn];
operation o[sn];

void apply(int x, operation op) {
  s[x] = calculate(op, s[x]);
  if (x < sn)
    o[x] = merge(op, o[x]);
}

void push(int x) {
  apply(x << 1, o[x]);
  apply(x << 1 | 1, o[x]);
  o[x] = operation();
}

sdata query(int a, int b, int l = 0, int r = sn, int x = 1) {
  if (b <= l || r <= a)
    return sdata();
  if (a <= l && r <= b)
    return s[x];
  push(x);
  return combine(query(a, b, l, (l + r) / 2, x << 1), query(a, b, (l + r) / 2, r, x << 1 | 1));
}

void apply(int a, int b, operation op, int l = 0, int r = sn, int x = 1) {
  if (b <= l || r <= a)
    return;
  if (a <= l && r <= b)
    return apply(x, op);
  push(x);
  apply(a, b, op, l, (l + r) / 2, x << 1);
  apply(a, b, op, (l + r) / 2, r, x << 1 | 1);
  s[x] = combine(s[x << 1], s[x << 1 | 1]);
}

void update(int x, int minhl, int maxhl) {
  apply(x, x + 1, operation());
  x += sn;
  s[x].minhl = minhl;
  s[x].maxhl = maxhl;
  while (x >>= 1)
    s[x] = combine(s[x << 1], s[x << 1 | 1]);
}

int n, q, h[200100], a[200100], b[200100], l[200100], r[200100], res[200100];
vector<int> actl[200100], deactl[200100], qur[200100];

int main() {
  cin >> n;
  for (int i = 0; i < n; i++) {
    cin >> h[i] >> a[i] >> b[i];
    actl[min(i + a[i], n)].push_back(i);
    deactl[min(i + b[i] + 1, n)].push_back(i);
  }
  cin >> q;
  for (int i = 0; i < q; i++) {
    cin >> l[i] >> r[i], l[i]--, r[i]--;
    qur[r[i]].push_back(i);
  }
  for (int i = 0; i < n; i++) {
    for (int j : actl[i])
      update(j, h[j], h[j]);
    for (int j : deactl[i])
      update(j, inf, -inf);
    apply(max(0, i - b[i]), max(0, i - a[i] + 1), { h[i], h[i] });
    for (int j : qur[i])
      res[j] = query(l[j], i).maxcost;
  }
  for (int i = 0; i < q; i++)
    cout << res[i] << "\n";
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...