제출 #104558

#제출 시각아이디문제언어결과실행 시간메모리
104558minhtung0404Two Antennas (JOI19_antennas)C++17
100 / 100
853 ms61704 KiB
#include<bits/stdc++.h> #define int long long const int N = 2e5 + 5; const int inf = 2e9; using namespace std; struct query{ int l, r, id; bool operator < (const query&a) const{ return r < a.r; } } qu[N]; vector <int> mv[2][N]; typedef pair <int, int> ii; ii it[N << 2], lazy[N << 2]; int n, q, Max[N << 2], h[N], a[N], b[N], ans[N]; ii up(ii a, ii b){ return ii(min(a.first, b.first), max(a.second, b.second)); } void dolazy(int i, int l, int r){ if (lazy[i] == ii(inf, -inf)) return; if (l != r){ lazy[i << 1] = up(lazy[i << 1], lazy[i]); lazy[i << 1 | 1] = up(lazy[i << 1 | 1], lazy[i]); } Max[i] = max(Max[i], max(lazy[i].second - it[i].first, it[i].second - lazy[i].first)); lazy[i] = ii(inf, -inf); } void update_h(int i, int l, int r, int pos, ii val){ dolazy(i, l, r); if (l > pos || pos > r || l > r) return; if (l == r){ it[i] = val; return; } int mid = (l + r) >> 1; update_h(i << 1, l, mid, pos, val); update_h(i << 1 | 1, mid+1, r, pos, val); it[i] = up(it[i << 1], it[i << 1 | 1]); } void update(int i, int l, int r, int L, int R, int val){ dolazy(i, l, r); if (L > r || l > R || l > r || L > R) return; if (L <= l && r <= R){ lazy[i] = ii(val, val); dolazy(i, l, r); return; } int mid = (l + r) >> 1; update(i << 1, l, mid, L, R, val); update(i << 1 | 1, mid+1, r, L, R, val); Max[i] = max(Max[i << 1], Max[i << 1 | 1]); } int get(int i, int l, int r, int L, int R){ dolazy(i, l, r); if (L > r || l > R || l > r || L > R) return -1; if (L <= l && r <= R) return Max[i]; int mid = (l + r) >> 1; return max(get(i << 1, l, mid, L, R), get(i << 1 | 1, mid+1, r, L, R)); } void add(int pos){ int l = max(1LL, pos - b[pos]), r = max(0LL, pos - a[pos]); for (auto p : mv[0][pos]) update_h(1, 1, n, p, ii(h[p], h[p])); for (auto p : mv[1][pos]) update_h(1, 1, n, p, ii(inf, -inf)); update(1, 1, n, l, r, h[pos]); l = min(n+1, pos + a[pos]), r = min(n, pos + b[pos]); mv[0][l].push_back(pos); mv[1][r+1].push_back(pos); } signed main(){ ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); for (int i = 0; i < N << 2; i++) it[i] = lazy[i] = ii(inf, -inf), Max[i] = -1; cin >> n; for (int i = 1; i <= n; i++) cin >> h[i] >> a[i] >> b[i]; cin >> q; for (int i = 1; i <= q; i++){ cin >> qu[i].l >> qu[i].r; qu[i].id = i; } sort(qu+1, qu+1+q); int cur = 1; for (int i = 1; i <= q; i++){ while (cur <= qu[i].r) add(cur++); ans[qu[i].id] = get(1, 1, n, qu[i].l, qu[i].r); } for (int i = 1; i <= q; i++) cout << ans[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...