제출 #1036533

#제출 시각아이디문제언어결과실행 시간메모리
1036533juicyTwo Antennas (JOI19_antennas)C++17
100 / 100
355 ms32708 KiB
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "debug.h"
#else
#define debug(...) 42
#endif

const int N = 2e5 + 5, inf = 1e9 + 7;

int n, q;
int h[N], a[N], b[N], s[4 * N], mn[4 * N], lz[4 * N], res[N];
vector<int> cands, events[N];
vector<array<int, 3>> Queries;

void bld(int id = 1, int l = 1, int r = n) {
  s[id] = -inf, lz[id] = 0, mn[id] = inf;
  if (l == r) { 
    return;
  }
  int md = (l + r) / 2;
  bld(id * 2, l, md);
  bld(id * 2 + 1, md + 1, r); 
}

void app(int id, int x) {
  s[id] = max(s[id], x - mn[id]);
  lz[id] = max(lz[id], x);
} 

void psh(int id) {
  if (lz[id]) {
    app(id * 2, lz[id]);
    app(id * 2 + 1, lz[id]);
    lz[id] = 0;
  }
}

void upd(int i) {
  int id = 1, l = 1, r = n;
  while (l ^ r) {
    int md = (l + r) / 2;
    psh(id);
    id *= 2;
    if (i <= md) {
      r = md;
    } else {
      l = md + 1;
      id += 1;
    }
  }
  mn[id] = mn[id] == inf ? h[i] : inf;
  while (id > 1) {
    id /= 2;
    mn[id] = min(mn[id * 2], mn[id * 2 + 1]);
    s[id] = max(s[id * 2], s[id * 2 + 1]);
  }
}

void upd(int u, int v, int x, int id = 1, int l = 1, int r = n) {
  if (u <= l && r <= v) {
    app(id, x);
    return;
  }
  psh(id);
  int md = (l + r) / 2;
  if (u <= md) {
    upd(u, v, x, id * 2, l, md);
  }
  if (md < v) {
    upd(u, v, x, id * 2 + 1, md + 1, r);
  }
  s[id] = max(s[id * 2], s[id * 2 + 1]);
}

int qry(int u, int v, int id = 1, int l = 1, int r = n) {
  if (u <= l && r <= v) {
    return s[id];
  }
  psh(id);
  int md = (l + r) / 2;
  if (v <= md) { 
    return qry(u, v, id * 2, l, md);
  }
  if (md < u) {
    return qry(u, v, id * 2 + 1, md + 1, r);
  }
  return max(qry(u, v, id * 2, l, md), qry(u, v, id * 2 + 1, md + 1, r));
}

void solve() {
  bld();
  for (int i = n, j = 0; i > 0; --i) {
    for (int j : events[i]) {
      upd(j);
    }
    int l = i + a[i], r = min(n, i + b[i]);
    if (l <= r) {
      upd(l, r, h[i]);
    }
    while (j < q && Queries[j][0] == i) {
      auto [l, r, id] = Queries[j++];
      res[id] = max(res[id], qry(l, r));
    }
  }
}

int main() {
  ios::sync_with_stdio(false); cin.tie(nullptr);

  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> h[i] >> a[i] >> b[i];
    int l = max(1, i - b[i]), r = i - a[i];
    if (l <= r) {
      events[r].push_back(i);
      events[l - 1].push_back(i);
    }
  }
  cin >> q;
  for (int i = 1; i <= q; ++i) {
    int l, r; cin >> l >> r;
    res[i] = -1;
    Queries.push_back({l, r, i});
  }
  sort(Queries.rbegin(), Queries.rend());
  solve();
  for (int i = 1; i <= n; ++i) {
    h[i] = inf - h[i] + 1;
  }
  solve();
  for (int i = 1; i <= q; ++i) {
    cout << res[i] << "\n";
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...